Saya mencoba menulis sebuah skrip yang akan memeriksa dua flag kesalahan, dan jika satu flag (atau keduanya) diubah itu akan echo-- kesalahan terjadi. Skrip saya:
my_error_flag=0
my_error_flag_o=0
do something.....
if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then
echo "$my_error_flag"
else
echo "no flag"
fi
Pada dasarnya, seharusnya, sesuatu:
if ((a=1 or b=2) or (a=1 and b=2))
then
display error
else
no error
fi
Kesalahan yang saya dapatkan adalah:
line 26: conditional binary operator expected
line 26: syntax error near `]'
line 26: `if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then'
Apakah kurung saya berantakan?
bash
if-statement
flags
Simply_me
sumber
sumber
a==1 or b==2
sudah mencakup case manaa==1 and b==2
. Menguji secara terpisah untuk itu benar-benar berlebihan di sini.Jawaban:
Gunakan
-a
(untuk dan) dan-o
(untuk atau) operasi.tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html
Memperbarui
Sebenarnya Anda masih bisa menggunakan
&&
dan||
dengan-eq
operasi. Jadi skrip Anda akan seperti ini:Meskipun dalam kasus Anda, Anda dapat membuang dua ekspresi terakhir dan tetap dengan satu atau operasi seperti ini:
sumber
[
dan]
untuk pengelompokan (mereka tidak melakukan itu), dan gagal menempatkan spasi di sekitar operator (misalnya"$my_error_flag"="1"
), yang mencegah shell dari mengenalinya sebagai operator sama sekali. Silakan baca BashFAQ # 17 (pada pengelompokan) dan # 31 (tentang perbedaan antara berbagai jenis ekspresi tes) . Sebenarnya, dalam hal ini akan lebih mudah untuk menggunakan ekspresi aritmatika .-a
dan-o
dianggap usang oleh spesifikasi POSIX ; gunakan tes terpisah dikombinasikan dengan||
seperti dalam pembaruan.{}
juga dimungkinkan.Anda dapat menggunakan salah satu
[[
atau((
kata kunci. Bila Anda menggunakan[[
kata kunci, Anda harus operator menggunakan tali seperti-eq
,-lt
. Saya pikir,((
paling disukai untuk aritmatika, karena Anda dapat langsung menggunakan operator seperti==
,<
dan>
.Menggunakan
[[
operatorMenggunakan
((
operatorJangan gunakan
-a
atau-o
operator Karena tidak Portable.sumber
Silakan coba ikuti
sumber
( ... )
menciptakan subkulit - banyak dampak kinerja tanpa manfaat.{ ...; }
untuk pengelompokan tanpa pembuatan subkulit.Anda bisa mendapatkan inspirasi dengan membaca
entrypoint.sh
skrip yang ditulis oleh kontributor dari MySQL yang memeriksa apakah variabel yang ditentukan telah ditetapkan.Seperti yang ditunjukkan skrip, Anda dapat mengirimnya dengan pipa
-a
, misalnya:sumber
-a
ditandai sebagai usang dalam versitest
standar POSIX saat ini ; lihatOB
penanda di pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html . Gunakan[ -z "$FOO" ] && [ -z "$BAR" ]
untuk memiliki kode yang lebih andal.