Bash'deki “do” anahtar sözcüğünün döngüler için amacı nedir?


76

doBash fordöngüsü sözdiziminde anahtar kelimenin amacı nedir ? Bana göre gereksiz geliyor.

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

Neden sözdizimi böyle değil?

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

Ben eminim gelmez bir amaç doldurun. Sadece öğrenmek istiyorum

Yanıtlar:


118

Bu sözdiziminin Bourne kabuğundan miras kaldığını unutmayın.

Değişken adından sonra, inaçıkça verilen öğelerin listesine sahip olabilirsiniz veya dokonumsal parametreler üzerinde dolaşmanız gerekebilir .

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

Veya

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

Her doiki durumda da (ilkinde kesinlikle gerekmese bile) sahip olmak daha tutarlı bir sözdizimi sağlar. Ayrıca , gerektiğinde while/ untildöngülerle de uyumludur do.

while
  cmd1
  cmd2
do
  cmd3
  cmd4
done

Koşul komutları dolistesinin nerede biteceğini söylemeniz gerekir .

Bourne kabuğunun desteklemediğini unutmayın for i; do. Bu sözdizimi, standardın 2016 sayısına kadar POSIX de değildi ( for i doher zaman POSIX olmuştur; ilgili Austin grubu böcekine bakınız ).

zsh gibi birkaç kestirme biçime sahiptir:

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

Veya birden fazla değişken için destek:

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

(yine de yukarıdaki yerine değişken kullanamazsınız inveya kullanamazsınız ).doj

Nadiren belgelenmiş olsa bile, çoğu Bourne benzeri kabukları (Bourne, ksh, bash, zsh, ashne de yash) desteklemektedir:

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

Bourne kabuğu kshve zsh(ancak bash) desteklenmez:

for i { echo "$i"; }

İken bash, kshve zsh(ancak Bourne kabuğu) desteği:

for i; { echo "$i"; }

Tümü (Bourne, bash, ksh, zsh) desteği:

for i
{ echo "$i";}

ksh93, bash, zshDesteği:

for ((i=1;i<=3;i++)) { echo "$i"; }

2
Her zaman olduğu gibi, eksiksiz ve mükemmel cevap (zsh 'a atıfta bulunarak) ...
Kiwy

2
Her iki durumda da "kesinlikle gerekli" değil for; komut bir yeni satır veya noktalı virgül ile sonlandırılabilir. Bu biraz daha mantıklıdır if/ ' while(ile eski thenyerine do), ancak prensip olarak bu onu ihmal olabilirdi ve çoklu komutları (nadir) kullanılmak üzere bir altkabuk veya parantez gerektiriyordu. Bourne kabuğunun bunu yapmasının asıl sebebinden şüpheliyim, çünkü ALGOL bunu yapıyor ve donehecelenmediğine sevinmeliyiz od.
Random832

4
@ Random832: Çünkü odzaten Octal Dump programının adı olarak kullanılıyordu.
user1024

8
Orada o kadar çok burada ben bilmiyordum. Teşekkür ederim!
Orbit'teki Hafiflik Yarışları

1
@mirabilos, for i doBourne ve POSIX, ancak kül bazlı kabukları IIRC'nin bazı eski sürümlerinde çalışmaz. boşluk karakterini içermiyorsa for i in "$@"Bourne kabuğunda çalışmayacak $IFS. for i<newline>doÇok eski BSD sistemlerini göz önünde bulundurmanız gerekirse, gerçekten de en taşınabilir olanı. Ayrıntılar için in-ulm.de/~mascheck/various/bourne_args bakın
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.