2016-06-01 21 views
0

私はUnix環境でのプログラミングの初心者で、始めにいくつかの問題に直面しています。私はWindows上でPUTTYを使用しています。 ここに私のスクリプトやコードですが、私はそれを実行すると、それはそれはパイプラインか何かで正常に動作しないようですシェル:整数式の表現エラーが予想される

整数式が

#!/bin/bash 

hour='date|cut-c12-13' 

if [ $hour -ge 0 -a $hour -lt 12 ]; then 
     echo "good morn" 
elif [ $hour -lt 18 ]; then 
    echo "good afternoon" 
else 
    echo "good night" 
fi 

を期待していることを私に伝えます;それは '日付'を元の日付に変換するのではなく、それを単語として解釈します。

+1

、「及び」として '-a'を使用してPOSIX仕様の現在のバージョンでは、明示的に陳腐化してマークされます。代わりにPOSIXに準拠したい場合は '[" $ hour "-ge 0] && [" $ hour "-lt 12]'を、そうでなければ '((hour> = 0 && hour <12))'最近の(はるかに読みやすい)bash固有の構文 –

+1

... POSIXテストの仕様についてはhttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.htmlを参照してください。 '-a'と' -o'の隣の 'OB'フラグはそれらを陳腐化してマークし、' XSI'フラグはそれらをPOSIX標準の拡張子としてマークします(すべてのシステムがそれらをサポートする必要はありません) 。 –

+1

(ああ、引用事項; '$ hour -ge 0]'と '' "$ hour" -ge 0] 'は同じではありません。後者は多くの一般的なケースでより良いエラーメッセージを可能にし、あなたは間違った結果を得ることができます。 –

答えて

4

コードには通常の引用符'…'が表示され、バックティック`…`は表示されません。 cut-c12-13

hour=$(date | cut -c12-13) 

間隔事項を使用します。一般に、$(…)を使用すると、バックティックを使用するよりも優れています(理由については、Pipe standard input and command line arguments in Bashを参照してください)。また、How to debug a Bash scriptを学んでください。つまり、bash -x script.shを意味します。

書かれているコードでは、は、文字列date|cut-c12-13(コマンドの出力ではありません)です。これは整数式ではないため、エラーメッセージです。また、ほとんどの場合、cut-c12-13というコマンドはありません。そのため、スペースが問題になります。質問のショーへのコメントとして


、また非推奨の演算子を使用していない、変数の参照を二重引用符を使用してdateコマンドからあなたが直接必要な情報を生成するから、取り組むべき他の複数の問題があります-aさらに余談として、などと[-o、そしてあなたが[ … ]に優先して[[ … ]]を使用する必要があることを主張したい人たち、またはバッシュ固有((…))があり、

+0

'$()'は簡単に入れ子にすることができるし、引用符で扱いやすくなるため、バッククォートよりも優れていると説明する価値があります。そしてあなたのコードを読んでいる人が誤ってあなたが一重引用符をタイプしたと思わないからです。 :) – dannysauer

+1

@dannysauer:質問にx-refを追加して、その問題について議論します。 –

+0

ありがとうございます。 bash -x script.shまで私はchmod + xを作成しました。 – Georgez

関連する問題