bash loop melalui daftar string

13

Apakah mungkin memformat sampel ini:

for i in string1 string2 stringN
do
 echo $i
done

untuk sesuatu yang mirip dengan ini:

for i in 
string1
string2
stringN
do
 echo $i
done

EDIT: Maaf untuk kebingungan, tidak menyadari bahwa ada metode berbeda dalam mengeksekusi skrip - sh <scriptname>versus bash <scriptname>dan juga hal ini yang tidak dapat saya sebutkan sekarang - #!/bin/shdan #!/bin/bash:)


sumber
Apa masalah yang Anda coba selesaikan?
jesse_b
Apakah Anda mencoba apa yang Anda minta untuk melihat apakah itu berhasil?
DopeGhoti
@Jesse_b keterbacaan dan pengelolaan kumpulan string
@OpeGhoti ya saya lakukan
@waayee: Dalam hal ini array adalah taruhan terbaik Anda. Lihat jawaban Glenn Jackman.
jesse_b

Jawaban:

32

Menggunakan array dalam bash dapat membantu keterbacaan: sintaks array ini memungkinkan spasi kosong di antara kata-kata.

strings=(
    string1
    string2
    "string with spaces"
    stringN
)
for i in "${strings[@]}"; do
    echo "$i"
done
glenn jackman
sumber
1
Ini tampaknya paling elegan, tetapi sayangnya memberikan kesalahan: Kesalahan sintaks: "(" tak terduga
1
@waayee, maka Anda tidak menjalankannya di Bash. Ingat itu shbelum tentu Bash, dan terutama tidak di Debian dan Ubuntu.
ilkkachu
1
@ilkkachu Pikir saya mengerti sekarang - harus menjalankan "bash <scriptname>" bukan "sh <scriptname>" :)
@waayee, atau letakkan garis hashbang / shebang yang tepat dan jalankan seperti layaknya dieksekusi. Bacaan wajib: Apakah shebang menentukan shell yang menjalankan skrip?
ilkkachu
1
@rrrrr, pertanyaan Anda mungkin dijawab di sini: stackoverflow.com/q/12314451/7552
glenn jackman
4

Anda dapat menghindari linebreak dengan backslash:

$ for i in \
> hello \
> world
> do
> echo $i
> done
hello
world
$
Andy Dalton
sumber
2

Anda dapat keluar dari baris baru sebelum / setelah setiap item yang Anda putar:

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

Atau, untuk contoh sederhana ini:

printf '%s\n' string1 string2 stringN

yang memiliki hasil yang sama.

Terkait:

Variasi menggunakan basharray:

strings=(
    string1
    string2
    stringN
)

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

Jika beralih ke zshadalah opsi:

for string (
  string1
  'other string'
  etc..
) printf '%s\n' "$string"
Stéphane Chazelas
sumber
0

Anda dapat menggunakan loopperintah, tersedia di sini , seperti:

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

atau, jika Anda memiliki daftar sebagai file:

$ cat file_list.txt | loop "echo $ITEM"
Rich Jones
sumber
0
list='a b c d'
for element in $list;do 
    echo "$element"
done
tamu
sumber
Anda kehilangan titik koma!
41754
Perhatikan bahwa ini akan berfungsi selama setiap string adalah kata yang terpisah. Segera setelah Anda memiliki spasi di string, spasi akan memecah string menjadi beberapa kata. Juga, jika $liststring berisi karakter nama globbing karakter ( list='* * * *'), shell berpotensi menggantikannya dengan nama file yang cocok.
Kusalananda
0

Hal yang sama, lebih sedikit teks:

array=(
        string{1..7}
)

for i in "${array[@]}"; do
    echo "$i"
done
Cornelis van Ginkel
sumber
string1dll. bukan nilai literal untuk ditampilkan, mereka adalah penampung, jadi pendekatan ini tidak berfungsi.
Stephen Kitt
jika demikian, mengapa repot array ( … )? lakukan saja for i in string{1..7}; do echo "$i"; done; evenprintf '%s\n' string{1..7}
αғsнιη