Chcę zapisać zmienną tablicy bash do pliku, z każdym elementem w nowej linii. Mógłbym to zrobić za pomocą pętli for, ale czy istnieje inny (czystszy) sposób łączenia elementów \n
?
50
Oto sposób wykorzystujący rozszerzenie parametrów bash i jego IFS
specjalną zmienną.
$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )
Używamy podpowłoki, aby uniknąć zastąpienia wartości IFS
w bieżącym środowisku. W tej podpowłoce modyfikujemy następnie wartość, IFS
aby pierwszy znak był znakiem nowej linii (przy użyciu $'...'
cudzysłowu). Na koniec używamy interpretacji parametrów do drukowania zawartości tablicy jako pojedynczego słowa; każdy element jest oddzielony pierwszym charater IFS
.
Aby przechwycić zmienną:
$ var=$( IFS=$'\n'; echo "${System[*]}" )
Jeśli Twój bash jest wystarczająco nowy (4.2 lub nowszy), możesz (i powinieneś) nadal używać printf
z -v
opcją:
$ printf -v var "%s\n" "${System[@]}"
W obu przypadkach możesz nie chcieć, aby końcowa nowa linia była w var
. Aby go usunąć:
$ var=${var%?} # Remove the final character of var
var=${var%?}
? To nie jest wyrażenie regularne, więc.
dopasuje tylko znak kropki.$ IFS=', ' $ echo ${VAR[*]} first second third $ echo "${VAR[*]}" first,second,third
Możesz użyć
printf
do wydrukowania każdego elementu tablicy w osobnym wierszu:źródło
lub
lub
lub
lub
lub
lub
lub
to wszystko, co do tej pory mogę przypomnieć.
źródło
Powyższe rozwiązania w zasadzie to są, ale pierwotne pytanie dotyczy danych wyjściowych do pliku:
Uwagi: 1) „echo” zapewnia ostatnią nową linię 2) Jeśli ten plik zostanie po prostu ponownie odczytany przez bash, to zadeklaruj -p może być pożądaną serializacją.
źródło
Używanie do :
Korzystanie z historii ; zauważ, że to się nie powiedzie, jeśli twoje wartości zawierają
!
:Korzystanie z basename ; zauważ, że to się nie powiedzie, jeśli twoje wartości zawierają
/
:Korzystanie z shuf ; pamiętaj, że wyniki mogą nie zostać wyświetlone w kolejności:
źródło
Moje podejście , używając tylko wbudowanych wersji Bash, bez mutowania
IFS
:Przykład
Możesz także użyć dowolnego separatora:
źródło
printf
wydaje się być najbardziej wydajnym podejściem do tworzenia łańcucha rozdzielanego z tablicy:Jeszcze prostszym sposobem na to jest:
Przykład
źródło