Apa tujuan dari kata kunci "lakukan" di Bash untuk loop?

76

Apa tujuan dari dokata kunci dalam forsintaks Bash loop? Bagi saya, itu terasa berlebihan.

for i in `seq 1 2`; do echo "hi"; done

Mengapa sintaksinya tidak seperti ini?

for i in `seq 1 2`; echo "hi"; done

Saya yakin bahwa itu tidak mengisi suatu tujuan. Saya hanya ingin belajar.

Fredrik Johansson
sumber

Jawaban:

118

Perhatikan bahwa sintaksis diwarisi dari shell Bourne.

Setelah nama variabel, Anda dapat memiliki indaftar elemen yang diberikan secara eksplisit, atau do, untuk mengulang parameter posisi.

for i in 1 2 3
do
  echo "$i"
done

Atau

set 1 2 3
for i do
  echo "$i"
done

Memiliki dodalam kedua kasus (bahkan jika itu tidak sepenuhnya diperlukan dalam yang pertama) membuat sintaks yang lebih konsisten. Ini juga konsisten dengan while/ untilloop di mana dodiperlukan.

while
  cmd1
  cmd2
do
  cmd3
  cmd4
done

Anda perlu domengetahui di mana daftar perintah kondisi berakhir.

Perhatikan bahwa shell Bourne tidak mendukung for i; do. Sintaks itu juga tidak POSIX sampai edisi 2016 standar ( for i doselalu POSIX; lihat bug grup Austin terkait ).

zsh memiliki beberapa bentuk steno seperti:

for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i

Atau dukungan untuk lebih dari satu variabel:

for i j (1 a 2 b) echo $i $j

(meskipun Anda tidak dapat menggunakan inatau dosebagai nama variabel di tempat di jatas).

Meskipun jarang didokumentasikan, sebagian besar shell mirip Bourne (Bourne, ksh, bash, zsh, tidak ashjuga yash) juga mendukung:

for i in 1 2 3; { echo "$i";}

Shell Bourne, kshdan zsh(tetapi tidak bash) juga mendukung:

for i { echo "$i"; }

Sementara bash, kshdan zsh(tetapi bukan shell Bourne) mendukung:

for i; { echo "$i"; }

Semua (Bourne, bash, ksh, zsh) dukungan:

for i
{ echo "$i";}

ksh93, bash, zshDukungan:

for ((i=1;i<=3;i++)) { echo "$i"; }
Stéphane Chazelas
sumber
2
Seperti biasa, jawaban lengkap dan sempurna (dengan referensi ke zsh) ...
Kiwy
2
Ini tidak "sangat diperlukan" dalam kedua kasus untuk for; perintah dapat diakhiri oleh baris baru atau titik koma. Itu membuat sedikit lebih masuk akal untuk if/ while(yang pertama dengan thendaripada do), tetapi pada prinsipnya itu bisa dihilangkan dan membutuhkan subkulit atau kawat gigi untuk penggunaan (jarang) perintah ganda. Saya curiga alasan sebenarnya mengapa shell Bourne melakukannya adalah karena ALGOL melakukannya, dan kita harus senang bahwa donetidak dieja od.
Random832
4
@ Random832: Itu karena odsudah digunakan sebagai nama program Octal Dump.
user1024
8
Ada banyak hal di sini yang tidak saya ketahui. Terima kasih!
Lightness Races dalam Orbit
1
@mirabilos, for i doadalah Bourne dan POSIX, tetapi tidak akan berfungsi di beberapa versi lama shell berbasis abu IIRC. for i in "$@"tidak akan berfungsi di shell Bourne jika $IFStidak mengandung karakter spasi. for i<newline>domemang yang paling portabel jika Anda perlu mempertimbangkan sistem BSD yang sangat tua. Lihat in-ulm.de/~mascheck/various/bourne_args untuk detailnya
Stéphane Chazelas