Bagaimana saya bisa melakukan sesuatu seperti ini di bash?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
bash
control-flow
Michael Mrozek
sumber
sumber
then
jalur terpisah.if ! command ; then ... ; fi
.[
itu sendiri perintah, dan itu tidak diperlukan dalam kasus ini.if [ ! command ]
tidak mengeksekusicommand
; itu memperlakukancommand
sebagai string dan memperlakukannya sebagai benar karena memiliki panjang yang tidak nol.[
adalah sinonim untuktest
perintahUntuk hal-hal kecil yang Anda inginkan terjadi jika perintah shell berfungsi, Anda bisa menggunakan
&&
konstruk:Demikian pula untuk hal-hal kecil yang Anda inginkan terjadi ketika perintah shell gagal, Anda dapat menggunakan
||
:Atau keduanya
Mungkin tidak bijaksana untuk melakukan banyak hal dengan konstruksi ini, tetapi mereka kadang-kadang dapat membuat aliran kontrol lebih jelas.
sumber
Periksa nilai
$?
, yang berisi hasil dari mengeksekusi perintah / fungsi terbaru:sumber
if
idiom Bash . Saya lebih suka jawaban Keith Thompson.if
adalah untuk melakukan ini. Kondisi kontrol aliran di Bash semuanya memeriksa di$?
belakang layar; itulah yang mereka lakukan. Memeriksa nilainya secara eksplisit seharusnya tidak perlu dalam sebagian besar kasus, dan biasanya merupakan antipattern pemula.if ! cmd
tidak apa-apa. Kalau tidak, pengaturan umum adalah menggunakanelse
klausa. Anda tidak dapat memiliki yang kosongthen
tetapi terkadang Anda melihat dithen : nothing; else
mana:
no-op signifikan.true
akan bekerja di sana juga.Ini bekerja untuk saya:
jika
command
berhasil, makaecho "OK"
dieksekusi, dan karena berhasil, eksekusi berhenti di sana. Kalau tidak,&&
akan dilewati, danecho "NOK"
dieksekusi.sumber
command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
command && echo "OK" || (c=$?; echo "NOK"; (exit $c))
?echo "OK"
bagian itu sendiri bisa gagal, maka ini lebih baik:command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
Perlu dicatat bahwa
if...then...fi
dan&&
/||
jenis pendekatan berkaitan dengan status keluar yang dikembalikan oleh perintah yang ingin kami uji (0 saat berhasil); namun, beberapa perintah tidak mengembalikan status keluar yang tidak nol jika perintah gagal atau tidak dapat menangani input. Ini berarti bahwa pendekatan biasaif
dan&&
/||
tidak akan bekerja untuk perintah-perintah tertentu.Misalnya, di Linux, GNU
file
masih keluar dengan 0 jika menerima file yang tidak ada sebagai argumen danfind
tidak dapat menemukan file yang ditentukan pengguna.Dalam kasus seperti itu, salah satu cara potensial kita dapat menangani situasi adalah dengan membaca
stderr
/stdin
pesan, misalnya yang dikembalikan denganfile
perintah, atau parse output dari perintah seperti difind
. Untuk tujuan itu,case
pernyataan dapat digunakan.sumber
Rawan kesalahan paling banyak yang bisa saya buat adalah:
RR=$?
Sekarang, tidak hanya untuk situasi ini, tetapi orang lain yang mungkin Anda hadapi, pertimbangkan:
variabel yang ditentukan:
$ AA=1 ; if (( "10#0${AA}" == 1 )) ; then echo yes ; else echo no ; fi
Jawab: ya
$ AA=1 ; if (( "10#0${AA}" != 1 )) ; then echo yes ; else echo no ; fi
Jawab: tidak
variabel tidak terdefinisi:
$ AA=1 ; if (( "10#0${BB}" == 1 )) ; then echo yes ; else echo no ; fi
Jawab: tidak
$ AA=1 ; if (( "10#0${BB}" != 1 )) ; then echo yes ; else echo no ; fi
Jawab: ya
$ AA=1 ; if (( "10#0${BB}" == 0 )) ; then echo yes ; else echo no ; fi
Jawab: ya
Ini mencegah semua jenis kesalahan.
Anda mungkin mengetahui semua sintaks, tetapi di sini beberapa tips:
"blank"
menjadinothing
.${variable}
.base-8
. Anda akan mendapatkan kesalahan seperti:value too great for base (error token is "08")
untuk nomor di atas7
. Saat itulah yang10#
berperan:10#
memaksa nomor menjadibase-10
.sumber
Kamu bisa melakukan ini:
sumber
ping
ditangkap karena menjalankannya sebagai perintah. Tetapi karena output diarahkan ke / dev / null yang akan selalu menjadi string kosong. Jadi Anda tidak menjalankan apa pun dalam subkulit, yang berarti status keluar sebelumnya (dari subkunci substitusi perintah, yaitu ping) akan dipertahankan. Jelas, cara yang benar ada diif ping ...; then
sini.Seperti disebutkan di bagian lain di utas ini, pertanyaan aslinya pada dasarnya menjawab sendiri. Berikut ini adalah ilustrasi yang menunjukkan bahwa
if
kondisi mungkin juga bersarang.Contoh ini digunakan
if
untuk memeriksa apakah ada file dan apakah itu file biasa. Jika kondisi tersebut benar, periksa apakah ukurannya lebih besar dari 0.sumber
sumber
Ini bisa dilakukan hanya dengan cara ini karena
$?
memberi Anda status perintah terakhir yang dijalankan.Jadi bisa jadi
sumber