Как преобразовать переменную массива bash в строку, разделенную символами новой строки?

Как преобразовать переменную массива bash в строку, разделенную символами новой строки?

Я хочу записать переменную массива bash в файл, где каждый элемент находится на новой строке. Я мог бы сделать это с помощью цикла for, но есть ли другой (более чистый) способ объединить элементы с помощью \n?

решение1

Вот способ, который использует расширение параметров bash и его IFSспециальную переменную.

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

Мы используем подоболочку, чтобы избежать перезаписи значения IFSв текущей среде. В этой подоболочке мы затем изменяем значение 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[@]}"

Связанный контент