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:)


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

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
$


1

Jika beralih ke zshadalah opsi:

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

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"

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

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

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нιη
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.