Saya bekerja dengan Bash 3, dan saya mencoba untuk membentuk bersyarat. Dalam C / C ++, sederhana mati nya: ((A || B) && C)
. Di Bash, ternyata tidak begitu (saya pikir para penulis Git harus menyumbang kode ini sebelum mereka pindah ke upaya lain).
Ini tidak bekerja. Perhatikan bahwa <0 or 1>
ini bukan string literal; itu berarti 0 atau 1 (umumnya berasal dari grep -i
).
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eqe "0" ]; then ... fi
Ini menghasilkan:
line 322: syntax error near unexpected token `[['
Saya kemudian mencoba:
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ ([ "$A" -eq "0" ]) || ([ "$B" -ne "0" ]) ] && [ "$C" -eq "0" ]; then ... fi
itu menghasilkan:
line 322: syntax error near unexpected token `[['
Bagian dari masalah adalah hasil pencarian adalah contoh-contoh sepele, dan bukan contoh yang lebih kompleks dengan kondisional majemuk.
Bagaimana cara melakukan yang sederhana ((A || B) && C)
di Bash?
Saya siap untuk membuka gulungannya dan mengulangi perintah yang sama di beberapa blok:
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ "$A" -eq "0" ] && [ "$C" -eq "0" ]; then
...
elif [ "$B" -ne "0" ] && [ "$C" -eq "0" ]; then
...
fi
[[ … ]]
ditambahkan dalam bash 2.02.((…))
telah ditambahkan di bash 2.0.||
dan&&
berubah dari[
ke[[
dan((
. Diutamakan sama dalam[
(gunakan tanda kurung untuk mengontrol urutan evaluasi), tetapi && memiliki prioritas lebih tinggi di dalam[[
dan((
daripada||
(seperti dalam C).Gunakan
[[
:Jika Anda suka
[
, yang berikut ini berfungsi:sumber
Gunakan
-o
operator alih-alih bersarang | |. Anda juga dapat menggunakan-a
untuk mengganti && jika diperlukan dalam laporan Anda yang lain.sumber
-a
dan-o
, tetapi saya tidak bereksperimen dengan mereka. Seseorang di Stack Overflow mengatakan untuk menghindarinya. Saya sebagian besar setuju dengan mereka karena skrip kurang dapat dibaca menggunakannya.[[ ( "$A" -eq "0" || "$B" -ne "0" ) && "$C" -eq "0" ]]
ada masalah pada mereka?bash
atau shell lain yang mengerti[[ ... ]]
.