Я хочу записать переменную массива bash в файл, с каждым элементом в новой строке. Я мог бы сделать это с помощью цикла for, но есть ли другой (более чистый) способ объединения элементов \n
?
50
Вот способ, который использует расширение параметра 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
var=${var%?}
вместо этого? Это не регулярное выражение, поэтому.
будет соответствовать только символ точки.$ IFS=', ' $ echo ${VAR[*]} first second third $ echo "${VAR[*]}" first,second,third
Вы можете использовать
printf
для печати каждого элемента массива в отдельной строке:источник
или
или
или
или
или
или
или
это все, что я могу напомнить до сих пор.
источник
Приведенные выше решения в значительной степени таковы, но исходный вопрос требует вывода в файл:
Примечания: 1) 'echo' предоставляет последний символ новой строки 2) Если этот файл будет просто снова прочитан bash, тогда объявить -p может быть желаемой сериализацией.
источник
Использование для :
Использование истории ; обратите внимание, что это не удастся, если ваши значения содержат
!
:Использование базового имени ; обратите внимание, что это не удастся, если ваши значения содержат
/
:Использование shuf ; обратите внимание, что результаты могут быть не в порядке:
источник
Мой дубль , использующий только встроенные функции Bash, без мутаций
IFS
:пример
Вы также можете использовать любой разделитель:
источник
printf
кажется наиболее эффективным подходом для создания строки с разделителями из массива:Еще более простой способ сделать это:
пример
источник