2011-01-21 3 views
1

私は、次のラッパースクリプトを持っている:bashの論理演算子はどのように動作しますか(または、なぜここで動作しません)?

#!/bin/bash 

$local_time=`date +%H%M` 
if [ $local_time -ge 1430 ] && [ $local_time -le 2230 ] || 
    [ $local_time -ge 0300 ] && [ $local_time -le 0400 ] 
then 
    echo 'pass' 
else 
    echo 'skip' 
fi 

2つのばらばらの時間間隔の間にスクリプトを実行するラッパースクリプトを作成することのアイデア。論理和を取る各式は正しく評価されますが、Iまたは両方の式を指定するとテストは失敗します。

これを修正するにはどうすればよいですか?

答えて

6

あなたは、あなたが括弧()と演算子の優先順位を強制する必要が彼らに

  • を展開するた場合にのみ、あなたがそれらに割り当てるときに$であなたの変数の接頭辞ない2つの問題

    1. を持っています

    また、すでにbashを使用しているため、より良い構文を使用して(())のすべてのOWSあなたは比較演算子< > == !=を使用すると、あなたはバッククォートの代わりにコマンド置換用$()を使用することができます/進として解釈され、ゼロで始まる

    #!/bin/bash 
    
    local_time=$((10#$(date +'%H%M'))) 
    if (((local_time >= 1430 && local_time <= 2230) || 
         (local_time >= 10#0300 && local_time <= 10#0400) )) 
    then 
        echo 'pass' 
    else 
        echo 'skip' 
    fi 
    

    番号をgravemarks。
    また、0から始まり8または9を含む番号はすべてエラーを出力します。
    接頭辞(10#)はそれを解決します。

  • +3

    もっと「近代的な」Bashの紹介はこれです:http://mywiki.wooledge.org/BashGuide – Telemachus

    +0

    私はこの文法がはるかにいいです!私はどのような構文を使っていましたか?私はbashの構文だったという印象を受けましたか? – skyeagle

    +0

    @skyeagle bashはPOSIX準拠のシェルで、 'POSIX Shell '(http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html)の構文を使っていました。これは' bash'ができることのサブセットです。 – SiegeX

    0

    bashには「論理演算子」はありません。それらは「条件付きチェーン」です。ロジックはテストに属します。

    あなただけのカッコのカップルと適切な優先度を強制する必要が
    if [[ (10#${local_time} -ge 10#1430 && 10#${local_time} -le 10#2230) || \ 
         (10#${local_time} -ge 10#0300 && 10#${local_time} -le 10#0400) ]] 
    then 
    ... 
    
    0

    #!/bin/bash 
    
    local_time=$(date +%H%M) 
    if ([ "$local_time" -ge 1430 ] && [ "$local_time" -le 2230 ]) || 
        ([ "$local_time" -ge 0300 ] && [ "$local_time" -le 0400 ]) 
    then 
        echo 'pass' 
    else 
        echo 'skip' 
    fi 
    

    理由:インサイドAND-ORリスト&&||は同じ優先順位を持っています。
    注:[ ]の中では、0から始まる数字は8進数として解釈されません。

    その他の変更:

    • 同等の左側には、単に変数名(ノー$)を持っている必要があります。
    • ``の代わりに$()を使用することをお勧めします。
    • 内部変数の引用符は[ ]です。
    関連する問題