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[@]}"