Bh komut dosyasında koşul varsa sorg


165

Ben bash için yeniyim ve aşağıdaki komutu reddetmeye çalışıyorum:

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

Bu, eğer internete bağlıysam koşul doğruysa. Bunun tam tersi olmasını istiyorum ama !herhangi bir yere koymak işe yaramıyor gibi görünüyor.


3
Onu nereye koydun? if ! [[ ...çalışır
diğer adam

1
ayrıca şu şekilde de kullanabilirsiniz: wget your_xxxx_params || (echo "oh oh" && çıkış 1)
AKS

2
> sadece bir hata
çıkarmak

Yanıtlar:


229

Seçebilirsiniz:

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

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

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

! sırasıyla aşağıdaki ifadenin dönüşünü tersine çevirir.


9
çift ​​destek gerekli mi? Neden?
Alexander Mills

1
@AlexanderMills: Bunu yapmanın birkaç yolu var. Çift veya tek parantez veya testkomut ile:if test $? -ne 0; then
Cyrus

4
Bu cevap gereksiz bir ayrıntıdır. if0 veya 1 olan bir ifade bekliyor, bu yüzden komutun kendisini kullanabilir ve tersine çevirebilirsiniz:if ! wget ...; then ...; fi
Nils Magnus


8

Tembel hissediyorsanız , operasyondan sonra ||(veya) ve &&(ve) kullanarak koşulları ele almak için kısa bir yöntem :

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

8
Gerçek hayattaki komut dosyalarında &&, echo komutundan sonra a öğesini değiştirmelisiniz ;. Bunun nedeni, çıktı tam diskteki bir dosyaya yeniden yönlendiriliyorsa, echohata döndürülecek ve exithiçbir zaman tetiklenmeyecektir. Bu muhtemelen istediğiniz davranış değildir.
Score_Under

ya da kullanabilirsiniz set -eve başarısız echoolursa senaryodan
çıkacaksınız

4

Sayıları karşılaştırdığınız için, parametrelerin daha kolay işlenmesini ve karşılaştırılmasını sağlayan aritmetik bir ifade kullanabilirsiniz :

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

Bunun yerine nasıl -nekullanabileceğinize dikkat edin !=. Aritmetik bir bağlamda, $parametrelere başlamamız bile gerekmez , yani,

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

mükemmel çalışıyor. Ancak bu $?özel parametreye uygun değildir .

Ayrıca, (( ... ))sıfır olmayan değerleri true olarak değerlendirdiğinden, yani sıfır olmayan değerler için 0 döndürme durumuna ve aksi takdirde 1 dönüş durumuna sahip olduğundan,

if (( $? )); then

ancak bu, kaydedilen tuş vuruşlarının değerinden daha fazla insanı karıştırabilir.

(( ... ))Yapı Bash mevcuttur, ancak gerekli değildir POSIX kabuk tarifnamede (olsa da, olası bir uzantısı olarak söz).

Tüm bunlar söyleniyor, Cole'un cevabında ve Steven'ın cevabında$? olduğu gibi bence tamamen kaçınmak daha iyidir .



@ DavidC.Rankin Oh, bunu bulamadım! Bu yüzden bir uzantı olarak bahsediliyor, ancak gerekli değil. Değiştireceğim.
Benjamin W.

1
Evet, o da beni hep yakaladı. Yine de hayatı kabukta kolaylaştırır:)
David C. Rankin

4

Bunun -neyerine eşitsiz karşılaştırmayı kullanabilirsiniz -eq:

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -ne 0 ]]; then
    echo "Sorry you are Offline"
    exit 1
fi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.