Saya perhatikan ada dua cara alternatif untuk membangun loop di zsh :
for x (1 2 3); do echo $x; done
for x in 1 2 3; do echo $x; done
Keduanya mencetak:
1
2
3
Pertanyaan saya adalah, mengapa kedua sintaksis itu? Apakah $x
iterasi melalui berbagai jenis objek di masing-masing?
Apakah bash membuat perbedaan yang sama?
Tambahan:
Mengapa cara berikut ini berhasil ?:
#!/bin/zsh
a=1
b=2
c=5
d=(a b c)
for x in $d; do print $x;done
tapi yang ini tidak ?:
#!/bin/zsh
a=1
b=2
c=5
d=(a b c)
# It complains with "parse error near `$d'"
for x $d; do print $x;done
for x ($d); do print $x; done
akan berfungsi, dan itu akan cocok dengan sintaks pertama yang telah Anda sebutkan di awal pertanyaan Anda.for i ({0..4..2}) for j ({a..c}) echo "($i,$j)"
={0,2,4}x{a,b,c}
. Titik koma berlaku untuk loop terluar dan pengalihan berlaku untuk innermost, dan jika Anda perlu mengubahnya, Anda hanya perlu kawat gigi:for i ({0..4..2}) { for j ({a..c}) echo "($i,$j)" } | cat -n
={1,...,9}*({0,2,4}x{a,b,c})
. Tentu saja Anda dapat menggabungkan loop dengan ekspansi zsh:for i ("("{0..4..2}","{a..c}")") echo $i
Jawaban:
Beberapa bentuk perintah kompleks seperti loop memiliki bentuk alternatif di zsh. Bentuk-bentuk ini sebagian besar terinspirasi oleh shell C , yang cukup umum ketika zsh masih muda tetapi sekarang telah menghilang. Bentuk-bentuk alternatif ini bertindak persis seperti bentuk normal, mereka hanya sintaks yang berbeda. Mereka sedikit lebih pendek, tetapi kurang jelas.
Bentuk standar untuk
for
perintah adalahfor x in 1 2 3; do echo $x; done
, dan bentuk standar untukwhile
perintah adalahwhile test …; do somecommand; done
. Ksh, bash dan zsh memiliki alternatif bentukfor
:for ((i = 0; i < 42; i++)); do somecommand; done
yang menirufor
loop bahasa seperti Pascal atau C, untuk menghitung bilangan bulat. Bentuk eksotis lainnya yang ada di zsh adalah khusus untuk zsh (tetapi sering terinspirasi oleh csh).sumber
zsh
? Juga, saya telah menambahkan satu contoh di akhir OP saya di mana saya tidak tahu bagaimana menerjemahkan antar sintaks. Jika perbedaannya hanya sintaks, bagaimana saya harus memperbaiki skrip kedua di addendum agar berfungsi?for x $d
dan zsh mengharapkan salah satuin
atau di(
mana Anda menulis$d
. Tanda baca dan kata-kata yang dipesan tidak dapat berasal dari ekspansi variabel, mereka harus diuraikan sebelum shell dapat mulai pada ekspansi variabel.for (( … ))
formulir dan menggunakan banyak memori jika 3 besar.do
setelah));
. Zsh juga menerima sintaks lain difor ((…)); COMMAND
manaCOMMAND
satu perintah. Itu sebabnya ia menerimafor ((i = 1; i<100; i++)); ghi show $i | grep "log"
. Ketika ia melihatdone
setelah ini, ia mengeluh karena tidak adado
akhir. Lihat “Formulir Alternatif Untuk Perintah Kompleks” di manual .