Saya ingin melakukan sesuatu seperti ini:
foo=( )
foo[0]="bar"
foo[35]="baz"
for((i=0;i<${#foo[@]};i++))
do
echo "$i: ${foo[$i]}"
done
# Output:
# 0: bar
# 1:
Lalu saya mencoba untuk mengulanginya menggunakan untuk di:
foo=( )
foo[0]="bar"
foo[35]="baz"
for i in ${foo[@]}
do
echo "?: $i"
done
# Output:
# ?: bar
# ?: naz
tapi di sini saya tidak tahu nilai indeksnya.
Saya tahu Anda bisa menyukai sesuatu
foo=( )
foo[0]="bar"
foo[35]="baz"
declare -p foo
# Output:
# declare -a foo='([0]="bar" [35]="baz")'
tetapi, tidak bisakah Anda melakukannya dengan cara lain?
(a b c)
untuk mengubahnya menjadi sebuah array.[@]
dan tanda kutip ganda berarti itu bukan "daftar kata-kata yang dipisahkan ruang". Anda mendapatkan daftar kunci array yang sebenarnya, bahkan jika masing-masing kunci berisi spasi.The use of [@] and double quotes means it's not a "space separated list of words"
"${foo[@]}"
mengambil variabel (array)foo
dan memperluasnya sebagai array, mempertahankan identitas elemen-elemennya, yaitu, tidak membaginya di whitespace. Jikafoo=(x 'y z')
, makaf "${foo[@]}"
panggilf
dengan dua argumen,x
dan'y z'
. Metadata kueri suka"${!foo[@]}"
dan"${#foo[@]}"
juga bertindakfoo
sebagai array."${!foo[@]}"
adalah daftar semua indeks yang diatur dalam array".Anda selalu dapat menggunakan parameter iterasi:
sumber
((ITER++))
dalam pesta modernsumber
Di bash 4, Anda dapat menggunakan array asosiatif:
Di bash 3, ini berfungsi (juga berfungsi di zsh):
sumber
sumber
Sederhana satu barisTrik untuk membuang array
Saya telah menambahkan satu nilai dengan spasi:
Saya, untuk membuang dengan cepat pestaarray atau array asosiatif yang saya gunakan
Perintah satu baris ini:
Will render:
Dijelaskan
printf "%s\n" "${!foo[@]}"
akan mencetak semua kunci yang dipisahkan oleh baris baru ,printf "%s\n" "${foo[@]}"
akan mencetak semua nilai yang dipisahkan oleh baris baru ,paste <(cmd1) <(cmd2)
akan menggabungkan outputcmd1
dancmd2
baris demi baris.Tunning
Ini bisa disetel dengan
-d
sakelar:atau bahkan:
Array asosiatif akan bekerja sama:
Masalah dengan baris baru atau karakter khusus
Sayangnya, setidaknya ada satu kondisi yang membuat ini tidak berfungsi lagi: ketika variabel mengandung baris baru:
Perintah
paste
akan menggabungkan baris demi baris, sehingga output akan menjadi salah:Untuk pekerjaan ini, Anda bisa menggunakan
%q
alih-alih%s
diprintf
perintah kedua (dan mengutip whipe):Akan membuat sempurna:
Dari
man bash
:sumber
printf "%q\n" "${var[@]}"
Suara saya untuk baris baru adalah masalah saya!