bash 配列変数を改行で区切られた文字列に変換するにはどうすればよいですか?

bash 配列変数を改行で区切られた文字列に変換するにはどうすればよいですか?

bash 配列変数をファイルに書き出し、各要素を新しい行に記述したいです。 for ループを使用してこれを行うこともできますが、要素を結合する別の (よりクリーンな) 方法はありますか\n?

答え1

IFSここでは、bash パラメータ拡張とその特殊変数を利用する方法を示します。

$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )

現在の環境でのの値が上書きされないように、サブシェルを使用します。そのサブシェルでは、 の最初の文字が改行文字になるようにIFSの値を変更します(引用符を使用)。最後に、パラメータ展開を使用して、配列の内容を 1 つの単語として出力します。各要素は の最初の文字で区切られます。IFS$'...'IFS

変数にキャプチャするには:

$ var=$( IFS=$'\n'; echo "${System[*]}" )

bash が十分に新しい場合 (4.2 以降)、以下のオプションを使用できます (使用する必要がありますprintf) -v

$ printf -v var "%s\n" "${System[@]}"

どちらの場合でも、 の最後の改行は不要ですvar。それを削除するには、次のようにします。

$ var=${var%?}    # Remove the final character of var

答え2

printf配列の各項目を独自の行に印刷するには、次のようにします。

 $ System=('s1' 's2' 's3' 's4 4 4')
 $ printf "%s\n"  "${System[@]}"
s1
s2
s3
s4 4 4

答え3

awk -v sep='\n' 'BEGIN{ORS=OFS="";for(i=1;i<ARGC;i++){print ARGV[i],ARGC-i-1?sep:""}}' "${arr[@]}"

または

perl -le 'print join "\n",@ARGV' "${arr[@]}"

または

python -c 'import sys;print "\n".join(sys.argv[1:])' "${arr[@]}"

または

sh -c 'IFS=$'\''\n'\'';echo "$*"' '' "${arr[@]}"

または

lua <(echo 'print(table.concat(arg,"\n"))') "${arr[@]}"

または

tclsh <(echo 'puts [join $argv "\n"]') "${arr[@]}"

または

php -r 'echo implode("\n",array_slice($argv,1));' -- "${arr[@]}"

または

ruby -e 'puts ARGV.join("\n")' "${arr[@]}"

今のところ思い出せるのはこれだけです。

答え4

使用のために:

for each in "${alpha[@]}"
do
  echo "$each"
done

使用歴史; 値に以下が含まれている場合、これは失敗します!:

history -p "${alpha[@]}"

使用ベース名; 値に以下が含まれている場合、これは失敗します/:

basename -a "${alpha[@]}"

使用シャフ; 結果は順番通りに表示されない場合があることに注意してください:

shuf -e "${alpha[@]}"

関連情報