Jika ingin mengekspresikan tes berikut dalam shell (sh):
if ( a == 1 && ( b == 1 || b == 2 )) { ... }
Sejauh ini, yang terbaik yang bisa saya tulis adalah ini:
if [[ $a -eq 1 ]]; then
if [[ $b -eq 1 || $b -eq 2 ]]; then
...
fi
fi
Saya tidak tahu bagaimana cara menggabungkan && dan || dengan prioritas yang benar. Googling belum memberi saya jawaban apa pun (tutorial hanya memberikan contoh dasar, jika ada)
Apa sintaksis untuk menggabungkan keduanya jika menjadi satu?
ksh
? Maka kode awal Anda hanya akan membutuhkan satu pasang kurung lagi:if (( a == 1 && ( b == 1 || b == 2 ))); then :; fi
Jawaban:
Perhatikan bahwa
[[ ]]
tidak ada dalam Bourne atau POSIXsh
. Untuksh
sintaks yang sebenarnya , ada beberapa cara untuk melakukan ini.Hanya menggunakan satu
[ ]
pasanganatau Menghindari POSIX
-a
dan-o
opsi 11 Salah satu alasan untuk menghindari
-a
dan-o
portabilitas maksimum - tidak semuatest
atau[
implementasi dapat menangani lebih dari 4 argumen, yang persis sama dengan apa yang Anda dapatkan jika Anda menghubungkan ekspresi dengan-a
dan-o
dan\( \)
.sumber
/bin/sh
, menulis skrip menggunakan fitur yang tidak ada salahsh
. Anda harus menyadari bahwaksh
BUKANsh
, tetapi superset dari BUKANsh
. Jika Anda membawa skripksh
-tapi-dinyatakan-sebagai-sh
ke sistem di manash
bukan symlinkksh
, mungkin rusak. Anda dapat menghindari masalah itu dengan memastikan skrip Anda cocok dengan deklarasi./bin/sh
akan meminta/bin/sh
. Masalahnya adalah/bin/sh
tidak menerima[[
. Anda tidak dapat menggunakan[[
atau menggunakan shell yang menerima[[
, misalnyaksh
, sebagai shebang Anda.-a
/ saya-o
tidak didukung oleh beberapa implementasi tetapi itu tidak dapat diandalkan untuk argumen sewenang-wenang. Suka[ "$a" = "$b" -o "$b" = "$c" ]
akan gagal untuk nilai$a
suka!
dengan banyak[
implementasi.Saya mencoba beberapa sintaks dan menemukan itu
sedang bekerja.
sumber
Pendekatan POSIX lain:
sumber
Cara yang tepat untuk melakukannya hanya dengan
shell
:Penjelasan:
test
di sini berfungsi sebagai tanda kurung dan-o
sebagai logis atau. Jika Anda seorang logis dan di dalam "kurung" Anda akan menggunakan-a
.Lebih lanjut tentang itu dapat ditemukan di sini
sumber