VAR=a,b,c,d
# VAR=$(echo $VAR|tr -d '\n')
echo "[$VAR]"
readarray -td, ARR<<< "$VAR"
declare -p ARR
Wynik:
[a,b,c,d]
declare -a ARR=([0]="a" [1]="b" [2]="c" [3]=$'d\n')
Jak mogę powiedzieć, żeby readarray
nie dodawać ostatniej linii \n
? Jakie jest znaczenie najnowszego $
symbolu?
bash
bash-array
użytkownik1156544
źródło
źródło
"What is the meaning of the latest $ symbol?"
Odpowiedzi:
Niejawny końcowy znak nowej linii nie jest dodawany przez
readarray
wbudowane, ale przez here-string (<<<
) zbash
, zobacz Dlaczego bash tutaj-ciąg dodaje znak końca nowego wiersza? . Możesz się tego pozbyć, drukując ciąg bez użycia nowej liniiprintf
i czytając go za pomocą techniki zastępowania procesów< <()
właściwie by teraz generował
źródło
Możesz użyć split + glob (co dzieje się, gdy nie pozostawiasz cudzysłowu w kontekście listy). Przeszkadza nam to przez większość czasu, szkoda byłoby nie korzystać z niego, gdy go potrzebujemy:
Jest to nieco mniej skomplikowane niż pisanie pliku tymczasowego, a następnie wywoływanie
readarray
go jak wreadarray <<< "$string"
podejściu (pamiętaj też, żereadarray -d
potrzebuje najnowszej wersjibash
).Należy zauważyć, że pomimo
S
wIFS
(co oznacza separatora ), który działa w ten sam sposób jakreadarray
w którya,,b,
jest podzielony na"a"
,""
i"b"
tylko.Dla prawdziwego operatora podziału możesz użyć
zsh
zamiast tego:(
@
i podwójne cudzysłowy, aby zachować puste elementy).źródło
readarray <<< "$string"
Zapisuje do pliku tempp a następnie usuwa je zamiast korzystania z pamięci?readarray -d
Puszkowana wersja odpowiedzi @ StéphaneChazelas:
local -
Uczyni opcje takie jakset -f
(noglob
) lokalne do funkcji, tak jak zmienne.declare -n a=$1
Stworzy lokalną zmiennąa
jako alias do zmiennej globalnej o nazwie$1
(pierwszy argument funkcji).źródło