Bagaimana saya bisa melakukan sesuatu seperti ini di bash?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
Bagaimana saya bisa melakukan sesuatu seperti ini di bash?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
Jawaban:
Bagaimana melakukan sesuatu secara kondisional jika suatu perintah berhasil atau gagal
Itulah yang dilakukan if
pernyataan bash :
if command ; then
echo "Command succeeded"
else
echo "Command failed"
fi
Menambahkan informasi dari komentar: Anda tidak perlu menggunakan [
... ]
sintaks dalam kasus ini. [
itu sendiri perintah, sangat hampir setara dengan test
. Ini mungkin perintah yang paling umum digunakan dalam if
, yang dapat mengarah pada asumsi bahwa itu adalah bagian dari sintaks shell. Tetapi jika Anda ingin menguji apakah suatu perintah berhasil atau tidak, gunakan perintah itu sendiri secara langsung if
, seperti yang ditunjukkan di atas.
Sunting: Mengutip pertanyaan di bagian atas untuk kejelasan (jawaban ini tidak muncul di dekat bagian atas halaman).
then
jalur terpisah.
if ! command ; then ... ; fi
. [
itu sendiri perintah, dan itu tidak diperlukan dalam kasus ini.
if [ ! command ]
tidak mengeksekusi command
; itu memperlakukan command
sebagai string dan memperlakukannya sebagai benar karena memiliki panjang yang tidak nol. [
adalah sinonim untuk test
perintah
Untuk hal-hal kecil yang Anda inginkan terjadi jika perintah shell berfungsi, Anda bisa menggunakan &&
konstruk:
rm -rf somedir && trace_output "Removed the directory"
Demikian pula untuk hal-hal kecil yang Anda inginkan terjadi ketika perintah shell gagal, Anda dapat menggunakan ||
:
rm -rf somedir || exit_on_error "Failed to remove the directory"
Atau keduanya
rm -rf somedir && trace_output "Removed the directory" || exit_on_error "Failed to remove the directory"
Mungkin tidak bijaksana untuk melakukan banyak hal dengan konstruksi ini, tetapi mereka kadang-kadang dapat membuat aliran kontrol lebih jelas.
Periksa nilai $?
, yang berisi hasil dari mengeksekusi perintah / fungsi terbaru:
#!/bin/bash
echo "this will work"
RESULT=$?
if [ $RESULT -eq 0 ]; then
echo success
else
echo failed
fi
if [ $RESULT == 0 ]; then
echo success 2
else
echo failed 2
fi
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 menggunakan else
klausa. Anda tidak dapat memiliki yang kosong then
tetapi terkadang Anda melihat di then : nothing; else
mana :
no-op signifikan. true
akan bekerja di sana juga.
Ini bekerja untuk saya:
command && echo "OK" || echo "NOK"
jika command
berhasil, maka echo "OK"
dieksekusi, dan karena berhasil, eksekusi berhenti di sana. Kalau tidak, &&
akan dilewati, dan echo "NOK"
dieksekusi.
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 biasa if
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 dan find
tidak dapat menemukan file yang ditentukan pengguna.
$ find . -name "not_existing_file"
$ echo $?
0
$ file ./not_existing_file
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0
Dalam kasus seperti itu, salah satu cara potensial kita dapat menangani situasi adalah dengan membaca stderr
/ stdin
pesan, misalnya yang dikembalikan dengan file
perintah, atau parse output dari perintah seperti di find
. Untuk tujuan itu, case
pernyataan dapat digunakan.
$ file ./doesntexist | while IFS= read -r output; do
> case "$output" in
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed
$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi
File not found
Rawan kesalahan paling banyak yang bisa saya buat adalah:
RR=$?
Sekarang, tidak hanya untuk situasi ini, tetapi orang lain yang mungkin Anda hadapi, pertimbangkan:
$ 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
$ 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"
menjadi nothing
.${variable}
.base-8
. Anda akan mendapatkan kesalahan seperti:
value too great for base (error token is "08")
untuk nomor di atas 7
. Saat itulah yang 10#
berperan:10#
memaksa nomor menjadi base-10
.Kamu bisa melakukan ini:
if ($( ping 4.4.4.4 -c1 > /dev/null )) ; then
echo "ping response succsess!!!"
fi
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 di if 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.
#!/bin/bash
echo "Which error log are you checking today? "
read answer
if [ -f /opt/logs/$answer*.errors ]
then
if [ -s /opt/logs/$answer*.errors ]
then
echo "Content is present in the $answer error log file."
else
echo "No errors are present in the $answer error log file."
fi
else
echo "$answer does not have an error log at this time."
fi
#!/bin/bash
if command-1 ; then
echo "command-1 succeeded and now running from this block command-2"
command-2
else
echo "command-1 failed and now running from this block command-3"
command-3
fi
Ini bisa dilakukan hanya dengan cara ini karena $?
memberi Anda status perintah terakhir yang dijalankan.
Jadi bisa jadi
#!/bin/sh
... some command ...
if [ $? == 0 ] ; then
echo '<the output message you want to display>'
else
echo '<failure message>'
fi