Kabuk komut dosyasında mantıksal VEYA işlemi nasıl yapılır


571

Basit bir durum kontrolü yapmaya çalışıyorum, ama işe yaramıyor gibi görünüyor.

Eğer $#eşit 0veya daha büyükse 1o zaman merhaba de.

Ben aşağıdaki sözdizimini hiç denemeden denedim:

if [ "$#" == 0 -o "$#" > 1 ] ; then
 echo "hello"
fi

if [ "$#" == 0 ] || [ "$#" > 1 ] ; then
 echo "hello"
fi

İkisi de benim için çalışıyor. Mesele hattında bir mermi belirttiniz mi?
Jason McCreary

1
@Jason aslında shebang hattını unuttum, ama şimdi onunla test ettim ve işe yaramadı.
Çilek

25
>sh / bash olarak çıkış yeniden yönlendirmesidir. Şimdi muhtemelen adlı bir dosyanız var 1.
mark4o

Bash karşılaştırmaları hakkında bilgi için, lütfen burada ve burada önceki soruların cevaplarına bakın . Köşeli ayraçlar, çift köşeli ayraçlar ve çift parantezler hakkında ek bilgi için cevabımı burada bulabilirsiniz .
sonraki duyuruya kadar duraklatıldı.

Çalışmaz, çünkü karşılaştırmayı yanlış yazarsınız: "$ #" == "0" veya $ # -eq 0
ETech

Yanıtlar:


987

Bu çalışmalı:

#!/bin/bash

if [ "$#" -eq 0 ] || [ "$#" -gt 1 ] ; then
    echo "hello"
fi

Bunun diğer kabuklarda farklı olup olmadığından emin değilim, ancak <,> kullanmak istiyorsanız, bunları çift parantez içine koymanız gerekir:

if (("$#" > 1))
 ...

2
Başka bir kabukta farklı olup olmadığından emin değilim, bash'da,> veya <kullanmak istiyorsanız, bunları şu şekilde çift parantez içine koymanız gerekir: (("$ a" <"$ b"))
Kodlama Bölge

1
@Doug: Unix'in onları kullanmaması değil, bash ve tanıdığım diğer tüm kabuklar onları giriş / çıkış yeniden yönlendirmesi için kullanıyor.
Cascabel

56

Bu kod benim için çalışıyor:

#!/bin/sh

argc=$#
echo $argc
if [ $argc -eq 0 -o $argc -eq 1 ]; then
  echo "foo"
else
  echo "bar"
fi

Ben sh "==" destekler sanmıyorum. Dizeleri karşılaştırmak için "=" ve girişleri karşılaştırmak için -eq kullanın.

man test

daha fazla ayrıntı için.


Şundan büyük için seçenek nedir? Tihs için resmi belgeler nerede?
Çilek

3
Daha -gtbüyük olmalıdır . Ya da sadece hepsini değiştirin [ $# -ne 1 ].
mark4o

-Gt'den daha büyük, cevabımı gör. Resmi dokümantasyon jbremnant'ın işaret ettiği gibi insan testindedir.
Kodlama Bölgesi

Kabuğunuza bağlı olarak diğerleri için bir fyi gibi, karşılaştırma operatörü olarak çoğu destek == (şimdi bir gün), ancak çoğu zaman = operatörü ile aynıdır. Ben karşılaştırma için -gt ve -ne kullanıyorsanız, komut dosyası stilinizi tutarlı tutmak için == veya = için -eq kullanmanın daha iyi bir uygulama olacağını hayal ediyorum. Mutlu Bashing :)
jkdba

34

$ Bash çıkış kodu durumunu kullanıyorsanız ? değişken olarak, bunu yapmak daha iyidir:

if [ $? -eq 4 -o $? -eq 8 ] ; then  
   echo "..."
fi

Çünkü eğer yaparsanız:

if [ $? -eq 4 ] || [ $? -eq 8 ] ; then  

YA sol kısmı kişiliklerinden $? değişkeni, bu yüzden OR sağ tarafında orijinal $? değer.


2
$ # betiğe geçirilen argüman sayısını döndürür. Doğru kullanımı kontrol etmek için kullanışlıdır. Asker çıkış kodlarını kullanıyor gibi görünmüyor.
Centimane

27

Bazen çift parantez kullanmanız gerekir, aksi takdirde çok fazla argüman gibi bir hata alırsınız

if [[ $OUTMERGE == *"fatal"* ]] || [[ $OUTMERGE == *"Aborting"* ]]
  then
fi

1
Bu yararlıdır, çünkü sözdiziminde biraz farklı olan tamsayı olmayan karşılaştırmaların bir örneğini gösteren tek şey budur.
Christopher Hunter

13

Eğer bir bash betiği

If [[ $input -gt number  ||  $input  -lt number  ]]
then 
    echo .........
else
    echo .........

fi

exit

7

böyle bir şey denediniz mi:

if [ $# -eq 0 ] || [ $# -gt 1 ] 
then
 echo "$#"
fi

Evet bende var. Bu echotek bir argüman var bile merhaba bu.
Çilek

İkincisi $#ilk testin dönüş değeri olabilir mi?
luckydonald

5

Gönderen Bash → Reference Manual 3.4.2 Özel Parametreleri

#
($ #) Ondalık olarak konumsal parametre sayısına genişler.

Bu nedenle, $#her zaman 0 veya daha büyük bir tam sayı olacaktır.

Ne zaman bir şey yapmak istiyorum Yani eğer $#ya 0 ya da 1 daha büyük ise, sadece kontrol etmek zorunda $#olduğu ya da olmadığı 1:

[ $# -eq 1 ] && echo "1 positional param" || echo "0 or more than 1"

Bu sözdizimini kullanır:

[ condition ] && {things if true} || {things if false}

bash gibi bir şey yapabilirsiniz:[[ -n $A ]] && echo 1 || echo 2
premek.v

@ premek.v yorum için teşekkürler. Cevabım çok kötü bir şekilde açıklandı, sadece konuya daha fazla ışık tutması umuduyla düzenledim.
fedorqui 'SO

1

Ve Bash'te

 line1=`tail -3 /opt/Scripts/wowzaDataSync.log | grep "AmazonHttpClient" | head -1`
 vpid=`ps -ef|  grep wowzaDataSync | grep -v grep  | awk '{print $2}'`
 echo "-------->"${line1}
    if [ -z $line1 ] && [ ! -z $vpid ]
    then
            echo `date --date "NOW" +%Y-%m-%d` `date --date "NOW" +%H:%M:%S` :: 
            "Process Is Working Fine"
    else
            echo `date --date "NOW" +%Y-%m-%d` `date --date "NOW" +%H:%M:%S` :: 
            "Prcess Hanging Due To Exception With PID :"${pid}
   fi

VEYA Bash

line1=`tail -3 /opt/Scripts/wowzaDataSync.log | grep "AmazonHttpClient" | head -1`
vpid=`ps -ef|  grep wowzaDataSync | grep -v grep  | awk '{print $2}'`
echo "-------->"${line1}
   if [ -z $line1 ] || [ ! -z $vpid ]
    then
            echo `date --date "NOW" +%Y-%m-%d` `date --date "NOW" +%H:%M:%S` :: 
            "Process Is Working Fine"
    else
            echo `date --date "NOW" +%Y-%m-%d` `date --date "NOW" +%H:%M:%S` :: 
            "Prcess Hanging Due To Exception With PID :"${pid}
  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.