Bash “for” döngü “foo bar…” kısmı olmadan


25

Geçenlerde beni şaşırtan bazı kodlara baktım çünkü işe yarıyor ve beklemiyordum. Kod bu örneğe indirgeniyor

#!/bin/bash
for var;
do
  echo "$var"
done

Komut satırı argümanları ile çalıştırıldığında bunları yazdırır

$ ./test a b c
a
b
c

Bu, bu (benim için) beklenmeyen bir şey. varTanımsız olduğu için neden bu bir hataya neden olmuyor ? Bunu kullanmak 'iyi uygulama' olarak mı kabul edilir?

Yanıtlar:


27

forin value1 value2...Bourne benzeri mermilerde hiçbir parça belirtilmemişse, döngüler konum parametrelerinde döngü oluşturur .

70'lerin sonlarından itibaren Bourne kabuğundaki durum buydu, ancak Bourne kabuğunda bunu ihmal ;etmeniz gerekirdi (ayrıca for i do(daha önce bir yeni hatta ihtiyaç duyduğunuz bazı eski kül versiyonları hariç do)).

Bkz . Bash'de "do" anahtar sözcüğünün döngüler için amacı nedir? daha şaşırtıcı değişkenler içeren daha fazla bilgi için .

Yapma:

for i
do
  something with "$i"
done

iyi bir uygulamadır. Genellikle eşdeğerden biraz daha taşınabilir / güvenilirdir:

for i in "$@"; do
  something with "$i"
done

bunun için Bourne kabuğunun ksh88'in bazı koşullar altında bazı sorunları vardır ( $#Bourne kabuğunun bazı sürümlerinde 0 iken (bunun ${1+"$@"}yerine "$@"çalışabilir) veya $IFSBourne ve ksh88'de boşluk karakteri içermiyorsa) veya Bu nounsetseçenek etkindir ve $#dahil bazı mermilerin bazı versiyonlarında 0'dır bash( tekrar ${1+"$@"}çalışma halinde ).


Beynim başlangıçta tekrarlanan 'döngüyü' düzenlemeyi bırakmadan önce bu üç kere okumak zorunda kaldı
Three Diag

20

Bu varsayılan davranış, evet. Bu belgelenmiştir helparasında foranahtar kelime:

terdon@tpad ~ $ help for
for: for NAME [in WORDS ... ] ; do COMMANDS; done
    Execute commands for each member in a list.

    The `for' loop executes a sequence of commands for each member in a
    list of items.  If `in WORDS ...;' is not present, then `in "$@"' is
    assumed.  For each element in WORDS, NAME is set to that element, and
    the COMMANDS are executed.

    Exit Status:
    Returns the status of the last command executed.

Bunu yineleme için bir liste üzerinde vermeyin zaman, bu yineleme için varsayılan olarak $@, konumsal parametreler dizisi ( a, bve csizin örnekte).

Ve bu davranış POSIX tarafından tanımlanmıştır, yani evet, olduğu kadar "iyi uygulama" olarak kabul edilir.

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.