Dalam bash, saya tahu bahwa adalah mungkin untuk menulis for
loop di mana beberapa variabel kontrol loop i
berulang di atas bilangan bulat yang ditentukan. Misalnya, saya bisa menulis skrip bash shell yang mencetak bilangan bulat antara 1 dan 10:
#!/bin/bash
for i in {1..10}
do
echo $i
done
Apakah mungkin untuk beralih di atas variabel kontrol loop yang merupakan string, jika saya memberikan daftar string? Misalnya, anggap saya memiliki string fname
yang mewakili nama file. Saya ingin memanggil satu set perintah untuk setiap nama file. Misalnya, saya mungkin ingin mencetak konten fname
menggunakan perintah seperti ini:
#!/bin/bash
for fname in {"a.txt", "b.txt", "c.txt"}
do
echo $fname
done
Dengan kata lain, pada iterasi pertama, fname
harus memiliki nilai fname="a.txt"
, sedangkan pada iterasi kedua, fname
harus memiliki nilai fname="b.txt"
, dan seterusnya. Sayangnya, tampaknya sintaks di atas tidak sepenuhnya benar. Saya ingin mendapatkan output:
a.txt
b.txt
c.txt
tetapi ketika saya mencoba kode di atas, saya mendapatkan output ini:
{a.txt,
b.txt,
c.txt}
Bisakah Anda membantu saya menentukan sintaks yang benar, sehingga saya bisa mengubah nilai / konten variabel secara berulang fname
? Terima kasih atas waktu Anda.
sumber
{}
, Anda tidak perlu apa pun untuk mengulang daftar (dibatasi-ruang){}
dan yang,
s. Alternatifnya adalah menghapus spasi. Jadi salah satu"a.txt" "b.txt" "c.txt"
atau{"a.txt","b.txt","c.txt"}
. Tapi saya lebih suka{a..c}.txt
sebagai gantinya.Jawaban:
Sintaks yang benar adalah sebagai berikut:
sumber
fnames=( a.txt b.txt c.txt )
Anda dapat menggunakan sintaksfor f in ${fnames[@]}; do echo $f; done
.for fname in a.txt b.txt c.txt
danfor fname in "a.txt" "b.txt" "c.txt"
menghasilkan hasil yang identik?for f in "${fnames[@]}"; do echo $f; done
(dengan tanda kutip${fnames[@]}
) jikafnames
nilainya mungkin berisi spasi kosong. Dan Anda harus menggunakannya"$f"
, terutama jika Anda melakukan sesuatu yang lebih canggih daripadaecho
(misalnya,cat
ataucp
). (Dan bahkan jika Anda hanya melakukannyaecho
, Anda harus menggunakannyaprintf
sebagai gantinya.)Menurut saya Anda hanya harus melakukan ...
sumber
Seperti yang dicatat oleh user13742 dalam komentar , kita dapat menggunakan array di
bash
danksh
:Dan berfungsi seperti itu:
Namun, beberapa shell seperti
dash
(/bin/sh
di Ubuntu) tidak mendukung array. Dalam kasus seperti itu kita dapat menggunakan struktur dokumen-sini:<<
sumber