Meniadakan jika kondisi dalam skrip bash


163

Saya baru mengenal bash dan saya terjebak mencoba meniadakan perintah berikut:

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
        echo "Sorry you are Offline"
        exit 1

Ini jika kondisi mengembalikan true jika saya terhubung ke internet. Saya ingin itu terjadi sebaliknya tetapi menempatkan di !mana saja tampaknya tidak berhasil.


3
Di mana Anda meletakkannya? if ! [[ ...bekerja
bahwa pria lain 20

1
Anda juga dapat menggunakannya dengan cara ini: wget your_xxxx_params || (Gema "oh oh" && keluar 1)
AKS

2
> memanggil subkulit hanya untuk menampilkan kesalahan
tijagi

Jawaban:


227

Kamu bisa memilih:

if [[ $? -ne 0 ]]; then       # -ne: not equal

if ! [[ $? -eq 0 ]]; then     # -eq: equal

if [[ ! $? -eq 0 ]]; then

! membalikkan pengembalian ekspresi berikut, masing-masing.


9
apakah kurung ganda diperlukan? mengapa demikian?
Alexander Mills

1
@AlexanderMills: Ada beberapa cara untuk melakukan ini. Dengan kurung ganda atau tunggal atau dengan testperintah:if test $? -ne 0; then
Cyrus

4
Jawaban ini tidak perlu bertele-tele. ifmengharapkan pernyataan yang 0 atau 1, sehingga Anda dapat menggunakan perintah itu sendiri dan membalikkannya:if ! wget ...; then ...; fi
Nils Magnus


8

Jika Anda merasa malas, berikut ini adalah metode penanganan kondisi yang singkat menggunakan ||(atau) dan &&(dan) setelah operasi:

wget -q --tries=10 --timeout=20 --spider http://google.com || \
{ echo "Sorry you are Offline" && exit 1; }

8
Dalam skrip kehidupan nyata, Anda harus mengubah perintah &&setelah gema menjadi a ;. Alasan untuk ini adalah bahwa jika output sedang diarahkan ke file pada disk penuh, echokegagalan akan kembali dan exittidak akan pernah menyala. Ini mungkin bukan perilaku yang Anda inginkan.
Score_Under

atau Anda dapat menggunakan set -edan gagal echoakan keluar dari skrip
Jakub Bochenski

4

Karena Anda membandingkan angka, Anda dapat menggunakan ekspresi aritmatika , yang memungkinkan penanganan parameter dan perbandingan yang lebih mudah:

wget -q --tries=10 --timeout=20 --spider http://google.com
if (( $? != 0 )); then
    echo "Sorry you are Offline"
    exit 1
fi

Perhatikan bagaimana alih-alih -ne, Anda bisa menggunakannya !=. Dalam konteks aritmatika, kita bahkan tidak perlu menambahkan $parameter, yaitu,

var_a=1
var_b=2
(( var_a < var_b )) && echo "a is smaller"

berfungsi dengan sangat baik. Ini tidak sesuai $?dengan parameter khusus.

Lebih lanjut, karena (( ... ))mengevaluasi nilai bukan nol menjadi benar, yaitu, memiliki status pengembalian 0 untuk nilai bukan nol dan status pengembalian 1 jika tidak, kita dapat mempersingkat menjadi

if (( $? )); then

tetapi ini mungkin membingungkan lebih banyak orang daripada nilai penekanan tombol yang disimpan.

The (( ... ))membangun tersedia di Bash, tetapi tidak diperlukan oleh POSIX shell spesifikasi (disebutkan sebagai kemungkinan perpanjangan, meskipun).

Semua ini dikatakan, lebih baik untuk menghindari $?sama sekali menurut saya, seperti dalam jawaban Cole dan jawaban Steven .



@ DavidC.Rankin Oh, saya tidak menemukan itu! Jadi disebutkan sebagai ekstensi, tetapi tidak diperlukan. Saya akan mengubah.
Benjamin W.

1
Ya, yang itu selalu membuat saya juga. Itu tentu membuat hidup lebih mudah di shell:)
David C. Rankin

4

Anda dapat menggunakan perbandingan yang tidak setara -nealih-alih -eq:

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -ne 0 ]]; then
    echo "Sorry you are Offline"
    exit 1
fi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.