dizge listesi üzerinden bash döngüsü


17

Bu örneği biçimlendirmek mümkün mü:

for i in string1 string2 stringN
do
 echo $i
done

buna benzer bir şeye:

for i in 
string1
string2
stringN
do
 echo $i
done

DÜZENLEME: Karışıklık için üzgünüm, komut dosyası yürütmek için farklı yöntemler olduğunu fark etmedi - sh <scriptname>karşı bash <scriptname>ve ayrıca şu anda adlandıramadığım bu şey - #!/bin/shve #!/bin/bash:)


Çözmeye çalıştığınız sorun nedir?
jesse_b

İşe yarayıp yaramayacağını görmek için ne istediğini denedin mi?
DopeGhoti

1
@Jesse_b demetlerin okunabilirliği ve yönetilebilirliği

@DopeGhoti evet yaptım

@waayee: Bu durumda bir dizi en iyi bahistir. Glenn Jackman'ın cevabına bakın.
jesse_b

Yanıtlar:


39

Bash'de diziler kullanmak okunabilirliğe yardımcı olabilir: bu dizi sözdizimi kelimeler arasında rasgele boşluk sağlar.

strings=(
    string1
    string2
    "string with spaces"
    stringN
)
for i in "${strings[@]}"; do
    echo "$i"
done

1
Bu en zarif görünüyor, ancak ne yazık ki hata veriyor: Sözdizimi hatası: "(" beklenmedik

1
@waayee, o zaman onu Bash'ta çalıştırmıyorsun. Bunun shmutlaka Bash olmadığını ve özellikle Debian ve Ubuntu'da olmadığını unutmayın.
ilkkachu

1
@ilkkachu Şimdi anladım - "bas <scriptname>" değil "sh <

@waayee, veya uygun bir hashbang / shebang hattı koymak ve bir çalıştırılabilir gibi çalıştırın. Gerekli okuma: Mesele senaryoyu çalıştıran kabuğu belirler mi?
ilkkachu

1
@rrrrr, sorularınız muhtemelen burada cevaplandırılmaktadır: stackoverflow.com/q/12314451/7552
glenn jackman

4

Bir ters eğik çizgi ile satırdan kaçabilirsiniz:

$ for i in \
> hello \
> world
> do
> echo $i
> done
hello
world
$

3

Üzerinde döngü yaptığınız her öğeden önce / sonra yeni satırlardan kaçabilirsiniz:

for i in \
    string1 \
    string2 \
    stringN
do
   printf '%s\n' "$i"
done

Veya bu basit örnek için:

printf '%s\n' string1 string2 stringN

aynı sonucu verir.

İlişkili:

Bir bashdizi kullanan varyasyon :

strings=(
    string1
    string2
    stringN
)

printf '%s\n' "${strings[@]}"

1

Geçiş yapmak zshbir seçenekse:

for string (
  string1
  'other string'
  etc..
) printf '%s\n' "$string"

1
list='a b c d'
for element in $list;do 
    echo "$element"
done

Noktalı virgül eksik!
41754

Her dize ayrı bir kelime olduğu sürece bunun işe yarayacağını unutmayın. Dizelerinizde boşluklar olur olmaz, boşluklar dizeyi birden çok kelimeye böler. Ayrıca, $listdize dosya adı globbing karakterleri ( list='* * * *') içeriyorsa , kabuk potansiyel olarak bunları eşleşen dosya adlarıyla değiştirir.
Kusalananda

0

Burada bulunan loopkomutu şu şekilde kullanabilirsiniz :

$ loop "echo $ITEM" --for string1,string2,string3

veya dosya olarak bir listeniz varsa:

$ cat file_list.txt | loop "echo $ITEM"

0

Aynı şey, daha az metin:

array=(
        string{1..7}
)

for i in "${array[@]}"; do
    echo "$i"
done

string1vb. gösterilecek gerçek değerler değil, yer tutuculardır, bu nedenle bu yaklaşım işe yaramaz.
Stephen Kitt

öyleyse, neden rahatsız oluyorsun array ( … )? sadece yap for i in string{1..7}; do echo "$i"; done; evenprintf '%s\n' string{1..7}
α 28sнιη
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.