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.

Sudh33ra
sumber
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.

Cyrus
sumber
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
87

Lebih baik

if ! wget -q --spider --tries=10 --timeout=20 google.com
then
  echo 'Sorry you are Offline'
  exit 1
fi
Steven Penny
sumber
1
Penting: menjaga jarak antara perintah !dan berikut ini jika tidak Anda akan melakukan ekspansi riwayat. unix.stackexchange.com/questions/3747/…
Roland
2
Steven mengapa Anda hanya punya 1 reputasi?
Roland
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; }
Cole Tierney
sumber
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 .

Benjamin W.
sumber
Anda yakin tentang (( ... ))? Referensi Programmer POSIX - Perintah Majemuk
David C. Rankin
@ 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
Davidhigh
sumber