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.