シェルスクリプトで論理OR演算を行う方法


571

簡単な状態チェックを行おうとしていますが、うまくいきません。

場合は$#、ISに等しい0かそれ以上である1、その後挨拶。

私は成功せずに次の構文を試しました:

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

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

どちらも私のために働いています。シバン行でシェルを指定しましたか?
Jason McCreary

1
@ジェイソン私は実際にシバンラインを忘れていましたが、私はそれを今それでテストしました、そしてそれはうまくいきませんでした。
Strawberry

25
>sh / bashでの出力リダイレクトです。おそらく、という名前のファイルがあります1
mark4o 2010年

Bashの比較については、ここここで以前の質問に対する私の回答を参照してください。角かっこ、二重角かっこ、二重かっこに関する詳細については、こちらの回答をご覧ください
追って通知があるまで一時停止。

使用"$#" == "0"または$#-eq 0:あなたはcompraison間違え原因それは動作しません
ETech

回答:


987

これはうまくいくはずです:

#!/bin/bash

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

これが他のシェルと異なるかどうかはわかりませんが、<、>を使用したい場合は、次のように二重括弧で囲む必要があります。

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

2
他のシェルとbashで異なるかどうかはわかりませんが、>または<を使用する場合は、次のように二重かっこで囲む必要があります:(( "$ a" <"$ b"))
コーディング

1
@Doug:unixがそれらを使用しないのではなく、bashと私が知っている他のすべてのシェルが入力/出力のリダイレクトに使用しています。
Cascabel 2010年

56

このコードは私にとってはうまくいきます:

#!/bin/sh

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

shが "=="をサポートしているとは思いません。文字列を比較するには "="を使用し、intを比較するには-eqを使用します。

man test

詳細については。


より大きいオプションは何ですか?tihsの公式ドキュメントはどこにありますか?
イチゴ

3
-gtより大きい必要があります。または、すべてをに置き換え[ $# -ne 1 ]ます。
mark4o 2010年

より大きい-gt、私の答えを見てください。jbremnantが指摘したように、公式のドキュメントは人間によるテスト中である。
コーディングディストリクト

他のfyiと同じように、シェルにもよりますが、ほとんどの場合、比較演算子として==(現在は日)をサポートしていますが、ほとんどの場合、=演算子と同じです。比較に-gtと-neを使用している場合、スクリプトスタイルの一貫性を保つために==または=に-eqを使用することをお勧めします。Happy Bashing :)
jkdba

34

bash終了コードステータス$を使用している場合 変数として、これを行うことをお勧めします:

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

なぜなら、もしそうなら:

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

OR左側の部分は$を変更しますか?変数なので、ORの正しい部分には元の$がありませんか?値。


2
$#は、スクリプトに渡された引数の数を返します。正しい使い方を確認するのに役立ちます。質問者が終了コードを使用しているようではありません。
Centimane

27

場合によっては、二重括弧を使用する必要があります。そうしないと、引数が多すぎるなどのエラーが発生します

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

1
これは、構文がわずかに異なる非整数比較の例を示す唯一の例であるため、便利です。
クリストファーハンター

13

bashスクリプトの場合

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

fi

exit


5

Bashリファレンスマニュアルから→3.4.2特殊パラメータ


($#)10進数の位置パラメーターの数に展開します。

したがって、$#常に0またはそれより大きい整数になります。

したがって、$#0か1より大きい場合に何かを実行したい場合$#は、次のことを確認する必要があり1ます。

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

これは構文を使用します:

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

:bashで、あなたのような何かを行うことができます[[ -n $A ]] && echo 1 || echo 2
premek.v

@ premek.vコメントありがとうございます。私の答えは非常にひどく説明されました、私はそれがトピックにもっと光を当てることを望んでそれを編集しました。
fedorqui 'SO stop harming' 2017

1

そしてバッシュで

 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

ORバッシュ

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.