2016-08-18 10 views
1

最後のものを除いて、|を持つbash配列の各要素を追加しようとしています。bash配列の最後の要素を除くすべての要素に文字を追加する

array=("element1" "element2" "element3") 

私の所望の出力は、私が唯一のことを使用することができ、他のループのアプローチがあり、私は

array=echo ${array1[@]}|sed 's/|$//' 

によって

for i in ${!array[@]}; 
do 
array1+=("${array[$i]}|") 
done 

行わ続いている何

array=("element1"|"element2"|"element3") 

だろう文字を追加する最後まで1つの要素まで?

+0

'アレイ=( "element1" | "element2" | "element3") 'は3の代わりに1つの要素にすぎません。 – anubhava

+0

@anubhava、はい、ただ1つの要素は問題ありません。 –

答えて

2

のみ一つの文字が各アレイメンバーとの間に挿入されなければならない特別な場合については、最も簡単な解決策は、利用アレイ膨張(および事前にあなたの必要性に応じて、分離文字IFSを変更する)に思われます。 (あなたがIFSを変更する気にしない場合)

$ array=("element1" "element2" "element3") 
$ array=($(IFS="|" ; echo "${array[*]}")) 
$ echo "\$array[0] is '${array[0]}'" 
$array[0] is 'element1|element2|element3' 
+0

これは[this one](http://stackoverflow.com/questions/1527049/bash-join-elements-of-an-array)への質問を減らしますが、OPはarray =($(IFS = "|"; echo "$ {array [*]}")) 'を使うことで簡単に行えます。コマンドの置換は 'IFS'の変更をサブシェルにきちんと限定するので、+1: –

+0

はい、これを指摘してくれてありがとう。私は単一メンバ配列を作成するという点は見ませんでしたが、これはもちろん要求されています。私はそれに応じて私の応答を更新したので、出力データ型は "array"です:) –

2

あなたは使用することができます。

# append | all except last element 
read -ra array < <(printf "%s|" "${array[@]:0:$((${#array[@]} - 1))}"; echo "${array[@]: -1}";) 

# Check array content now 
declare -p array 
declare -a array='([0]="element1|element2|element3")' 
  • "${array[@]:0:$((${#array[@]} - 1))}"
  • "${array[@]: -1}"配列の最後の要素を取得します
  • printf "%s|"は、すべての引数の前で|を追加しますすべてが、配列の最後の要素を取得します
  • < <(...)は、stdinからのコマンドの出力を読み取るためのプロセス置換です。
  • read -raが配列
+1

ありがとう@anubhava。正確に何をしたいのですか –

1
$ array=("element1" "element2" "element3") 
$ printf -v str "|%s" "${array[@]}" 
$ array=("${str:1}") 
$ declare -p array 
declare -a array='([0]="element1|element2|element3")' 

で入力を読み込みますprintf文は|element1|element2|element3を含む文字列str、(先頭の)私たちが望むよりも|すなわち、1より多くを作成します。

次の文では、部分文字列パラメータ展開${str:1}を使用して最初の文字をスキップし、arrayに割り当てます。これは現在単一の要素で構成されています。

1

簡単な解決策は以下のとおりです。

$ array=("element1" "element2" "element3") 
$ IFS="|"; printf "%s\n" "${array[*]}" 

とする再尻(IFSを変更しない)可変配列にIGN:

$ array=("$(IFS="|"; printf "%s\n" "${array[*]}")") 
$ printf '%s\n' "${array[@]}" 
element1|element2|element3 

代替ソリューションである:

$ array=($(printf '%s|' "${array[@]}")); array="${array%?}" 
$ printf '%s\n' "${array}" 

より複雑な溶液(スクリプト)である:

array=("element1" "element2" "element3") 

     delimiter='|' 
     unset newarr 
for val in "${array[@]}" 
do  newarr=$newarr${newarr+"$delimiter"}$val 
done 

array=("$newarr") 

echo "array=($array)" 
関連する問題