我想將 bash 數組變數寫入文件,每個元素都在新行上。我可以用 for 迴圈來做到這一點,但還有另一種(更乾淨的)方法來連接元素\n
嗎?
答案1
這是一種利用 bash 參數擴展及其IFS
特殊變數的方法。
$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )
IFS
我們使用子shell來避免覆蓋目前環境中的值。然後,在該子 shell 中,我們修改 的值,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[@]}"