2012-01-09 19 views
4

私は営業時間内にのみcurl呼び出しを実行するbashスクリプトを書いています。何らかの理由で、 "-a"演算子を追加すると(そして何らかの理由で私のbashが "& &"を認識しない)毎時の比較が失敗します。複数の-aが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の問題ですか?

答えて

13

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

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

<>は、標準入力や標準出力のリダイレクトを実行するためにシェルが使用されています。

実際には、現在のディレクトリに7という名前のファイルが作成されています。

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

これらすべてのための最良のドキュメント:man bash(および比較演算子の詳細についてはman test

+0

涼しい、それを知らなかった。お返事ありがとう=) –

+0

あなたはよろしいです;) –

+5

実際、 '[]]に' <' and '> 'を使用できますが、リダイレクトとして解釈されないようにエスケープまたは引用する必要があり、アルファベット文字列数値比較よりもむしろ比較。たとえば、 "7"はアルファベット順( "より大きい")の "17"なので、 '[7 \> 17]'は真です。 –

0

私はあなたが変数の参照と「標準」の演算子の前後に引用符を使用することをお勧め:

if [ "$HOUR" -gt 7 -a "$HOUR" -lt 17 ]; ...; fi 
+0

空白や特殊文字がないことがわかっている場合は、これを行う必要がありますか? –

+1

堅牢性(* date *コマンドが期待どおりに動作するという保証はありません)、それを習慣にします。 –

+0

bashのほうが[[代わりに。 – jordanm

0

ではなく[[を使用してみてくださいこれは安全性が高く、より多くの機能を備えているからです。数値比較には-gt-ltも使用してください。

if [[ $HOUR -gt 7 && $HOUR -lt 17 ]] 
then 
    # do something 
fi 
+0

(最後の行):[[:not found] –

+2

@Calvin Froedge:スクリプトがbashで実行されていないことを意味します。 '[['、 '#!/ bin/sh'の代わりに'#!/ bin/bash'で起動する必要がある場合は –

+0

Ahです。クール、感謝=) –

6

ここではいくつかの回答がありますが、実際の数値の文脈をお勧めしません。ここで

はbashでそれを行う方法です:「$」は、数値コンテキストで変数を展開するために必要とされていないことを

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

注意。

+0

これは間違いなく行く方法です。比較のために普遍的な数学記号を用いた画像。 – raider33

関連する問題