Pertanyaan ini adalah sekuel dari pertanyaan saya sebelumnya . Para pengguna di situs ini dengan baik hati membantu saya menentukan cara menulis bash for
loop yang diulang pada nilai string. Sebagai contoh, misalkan variabel kontrol loop fname
berulang di atas string "a.txt" "b.txt" "c.txt"
. Saya ingin echo
"ya!" kapan fname
memiliki nilai "a.txt"
atau "c.txt"
, dan echo
"tidak!" jika tidak. Saya telah mencoba skrip bash shell berikut:
#!/bin/bash
for fname in "a.txt" "b.txt" "c.txt"
do
echo $fname
if [ "$fname" = "a.txt" ] | [ "$fname" = "c.txt" ]; then
echo "yes!"
else
echo "no!"
fi
done
Saya mendapatkan output:
a.txt
tidak!
b.txt
tidak!
c.txt
Iya!
Mengapa if
pernyataan itu ternyata menghasilkan kebenaran ketika fname
memiliki nilai "a.txt"
? Apakah saya |
salah menggunakan ?
bash
shell-script
Andrew
sumber
sumber
-o
dalam yang sama[ ]
.||
dan memisahkan[ ]
lebih-o
untuk portabilitas hanya karena[
tidak dijamin untuk mendukung lebih dari 4 argumen. Tentu saja jika bahasa targetbash
, tidak ada yang harus menggunakan[
lagian karenabash
's[[
lebih unggul dalam banyak hal.if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
daripadaif [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]
?bash
, seperti yang sudah Anda lakukan. Salah satu keuntungan[[
adalah tidak melakukan pemisahan kata (case khusus) sehingga[[ $unquoted_var = string ]]
aman.Jawaban:
Jika Anda ingin mengatakan
OR
gunakan pipa ganda (||
).(Kode OP asli yang digunakan
|
adalah hanya menyalurkan output dari sisi kiri ke sisi kanan, dengan cara yang sama seperti pipa biasa bekerja.)sumber
||
tidak melakukan logika standar "ATAU" - itu sirkuit pendek, dan perintah kedua dijalankan hanya jika yang pertama gagal.OR
jika kondisi pertama bernilai true.==
tetapi setelah melihat jawaban ini, saya memutuskan untuk mencarinya. Rupanya, "itu dapat digunakan tetapi tidak standar". Saya pikir saya akan meletakkan ini di sini untuk orang lain jika Anda penasaran: stackoverflow.com/a/2237103test
direkomendasikan halaman manual jugaif [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
(Jika Anda ingin atau perlu memiliki fungsi tambahan yang terkait dengannya[[ ]]
).