如何將 bash 陣列變數轉換為以換行符號分隔的字串?

如何將 bash 陣列變數轉換為以換行符號分隔的字串?

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

相關內容