Dalam banyak bahasa dimungkinkan untuk menetapkan hasil dari pernyataan kasus / beralih ke variabel, daripada mengulangi penugasan variabel berkali-kali dalam pernyataan kasus. Apakah mungkin untuk melakukan hal seperti ini di shell Bash?
color_code=$(case "$COLOR" in
(red) 1;;
(yellow) 2;;
(green) 3;;
(blue) 4;;
esac)
(Atau, sebagai tambahan, di kulit lainnya?)
bash
shell
assignment
case
iconoclast
sumber
sumber
(
. Kalau tidak, tidak apa-apa.Jawaban:
The
variable=$(...)
membangun akan mengambil output standar perintah apa yang ada di$(...)
dan menetapkan kevariable
. Dengan demikian, untukvariable
ditugaskan seperti yang Anda inginkan, nilai-nilai harus dikirim ke output standar. Ini mudah dilakukan denganecho
perintah:Ini akan bekerja pada
bash
serta semua kerang POSIX lainnya.Opsional Left Parens
Menurut standar POSIX, paren kiri dalam
case
pernyataan adalah opsional dan yang berikut juga berfungsi:Seperti yang ditunjukkan Gilles dalam komentar, tidak semua shell menerima kedua formulir dalam kombinasi dengan
$(...)
: untuk tabel kompatibilitas yang sangat rinci, lihat "$ ()" substitusi perintah vs. tertanam ")" .sumber
(
sebagai opsional. Saya pikir itu mungkin membantu menghindari membiarkan)
salah ditafsirkan sebagai penutup)
untuk$(...)
ekspresi.(
adalah opsional: kode berfungsi sama tanpa atau tanpa mereka. Saya meninggalkan mereka hanya karena, baik atau buruk, itu adalah tradisi. Bagian penting dari solusi yang diusulkan adalah penggunaanecho
.(
untukcase
pola, tetapi beberapa kerang melakukannya dan membutuhkan pembukaan(
ketikacase
digunakan dalam substitusi perintah. Kerang modern baik-baik saja. Lihat di-ulm.de/~mascheck/various/cmd-substcolor_code=$(…)
menugaskan output dari…
perintah ke variabelcolor_code
, dengan baris baru dilucuti. Jadi, Anda perlu menghasilkan beberapa output. Kode yang Anda tulis mencoba dieksekusi1
sebagai perintah.Anda bisa menggunakan idiom ini. Catatan yang
color_code
akan kosong jika$COLOR
tidak ada nilai yang didukung.Tapi itu tidak terlalu idiomatis. Bahasa shell diarahkan untuk kombinasi sederhana dari perintah sederhana. Substitusi perintah besar ini canggung. Substitusi perintah membuat subkulit, yang lebih lambat daripada metode langsung:
Perbedaan semantik utama antara dua pendekatan adalah yang
$(…)
menciptakan subkulit, sehingga setiap penugasan, keluar, redirection, dll. Yang dilakukan di dalam tidak memiliki efek di luar.sumber