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.