VAR=a,b,c,d
# VAR=$(echo $VAR|tr -d '\n')
echo "[$VAR]"
readarray -td, ARR<<< "$VAR"
declare -p ARR
Hasil:
[a,b,c,d]
declare -a ARR=([0]="a" [1]="b" [2]="c" [3]=$'d\n')
Bagaimana saya bisa mengatakan readarray
untuk tidak menambahkan baris terakhir \n
? Apa arti dari $
simbol terbaru ?
bash
bash-array
pengguna1156544
sumber
sumber
"What is the meaning of the latest $ symbol?"
Jawaban:
Karakter baris baru trailing implisit tidak ditambahkan oleh
readarray
builtin, tetapi oleh string-sini (<<<
) daribash
, lihat Mengapa bash di sini-string menambahkan char baris baru trailing? . Anda dapat menghilangkannya dengan mencetak string tanpa menggunakan baris baruprintf
dan membacanya melalui teknik substitusi proses< <()
akan menghasilkan dengan benar sekarang
sumber
Anda bisa menggunakan split + glob (apa yang terjadi ketika Anda membiarkan ekspansi tidak dikutip dalam konteks daftar). Itu menghalangi sebagian besar waktu kita, akan memalukan untuk tidak menggunakannya ketika kita benar-benar membutuhkannya:
Itu sedikit kurang berbelit-belit daripada menulis file temp dan kemudian memanggilnya
readarray
seperti dalamreadarray <<< "$string"
pendekatan (juga perhatikan bahwareadarray -d
perlu versi yang sangat barubash
).Perhatikan bahwa meskipun
S
dalamIFS
(yang merupakan pemisah ), itu bekerja dengan cara yang sama sepertireadarray
dalam yanga,,b,
dibagi menjadi"a"
,""
dan"b"
hanya.Untuk operator pemisahan nyata, Anda bisa menggunakan
zsh
:(
@
Tanda kutip ganda dan untuk melestarikan elemen kosong).sumber
readarray <<< "$string"
menulis ke file tempp dan kemudian menghapus itu bukan menggunakan memori?readarray -d
Versi kalengan dari jawaban @ StéphaneChazelas:
The
local -
akan membuat pilihan sepertiset -f
(noglob
) lokal untuk fungsi, seperti variabel.The
declare -n a=$1
akan menciptakan lokal variabela
sebagai alias untuk variabel global yang disebut oleh$1
(argumen pertama ke fungsi).sumber