4

営業時間中にのみcurl呼び出しを実行するbashスクリプトを作成しました。何らかの理由で、「-a」演算子を追加すると、1 時間ごとの比較が失敗します (また、何らかの理由で、私の bash は「&&」を認識しません)。

スクリプトははるかに大きくなりますが、関連する部分は次のとおりです。

HOUR=`date +%k`

if [ $HOUR > 7 -a $HOUR < 17 ];
then
  //do sync
fi

スクリプトは私にエラーを与えます:

./tracksync: (last line): Cannot open (line number): No such file

ただし、この比較は失敗しません。

if [ $DAY != "SUNDAY" -a $HOUR > 7 ];
then
  //do sync
fi

構文が間違っていますか、それとも bash の問題ですか?

4

4 に答える 4

14

<>を bash スクリプトでそのまま使用することはできません。-ltそのためにand-gtを使用します。

if [ $HOUR -gt 7 -a $HOUR -lt 17 ]

<stdin または stdout のリダイレクトを実行するために>シェルによって使用されます。

あなたが言っている比較は、実際7には現在のディレクトリに名前の付いたファイルを作成しています。

について&&は、これもシェルにとって特別な意味を持ち、コマンドの「AND リスト」を作成するために使用されます。

これらすべてに最適なドキュメント: man bash(およびman test比較演算子の詳細)

于 2012-01-09T16:00:41.883 に答える
6

ここにはいくつかの回答がありますが、実際の数値コンテキストを推奨するものはありません。

これを bash で行う方法は次のとおりです。

if (( hour > 7 && hour < 17 )); then
   ...
fi

数値コンテキストで変数を展開するために「$」は必要ないことに注意してください。

于 2012-01-09T16:34:10.723 に答える
0

変数参照と「標準」演算子を引用符で囲むことをお勧めします。

if [ "$HOUR" -gt 7 -a "$HOUR" -lt 17 ]; ...; fi
于 2012-01-09T16:01:06.893 に答える
0

[[より安全で、より多くの機能を備えているため、代わりに使用してみてください。また、数値比較には-gtandを使用します。-lt

if [[ $HOUR -gt 7 && $HOUR -lt 17 ]]
then
    # do something
fi 
于 2012-01-09T16:01:15.213 に答える