Я хочу записать переменную массива 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[@]}"