- ベストアンサー
シェルスクリプトのエラーに対する解決方法
- 質問者は特定のフォルダ内に2つの圧縮ファイルが存在する場合、bbb.log.1を削除し、存在しない場合はメッセージを表示するシェルスクリプトを作成しました。
- しかし、実行すると「./test.sh: line 15: [: -e: binary operator expected」というエラーが表示されます。
- 正しく動作させるためには、if文の条件式を正しく記述する必要があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
if 文(やwhile文等)では、その後にくる「コマンド」の実行後のステータスで分岐します。 if grep 'a' foo.txt ; # foo.txtのaという文字が含まれているならば この使い方で、便利なコマンドとしてtestがあります。testは数値比較や文字列の比較、and/or等の論理演算を行って、その真偽をステータスとして返します。 このtestコマンドの「別名」が [ です。 [と]でくくることで、多言語のif文で条件を () でくくったような見た目になります。 そこで、エラー箇所を見ると > if [ test -e $i.$DATE.gz ]; then と、 [ と testの両方が指定されています。これでは、 [ コマンドの引数として test が指定してあることになります。 -e は単項演算子なので、 'test' -e ~ という式がおかしい( 「値」のあとには二項演算子が必要なのに単項演算子がきている )というエラーになっているのです。 if [ -e $i.$DATE.gz ]; then # [ を使う か if test -e $i.$DATE.gz ; then #testを使う としましょう。 あと、これをcronで実行させる、とのことですが、cronは環境変数の設定を行いません。 よって、PATHは設定されません。 そのため、 grep,sed,date等のコマンドは見付けることができず実行できません。 スクリプト中でPATHを指定するか、コマンドをフルパスで書くか、してください。
その他の回答 (2)
- tux_the_penguin
- ベストアンサー率42% (69/163)
#1の方もおっしゃっていますが [ ← この文字は見やすくするための記号ではなく test と言うコマンドの別表記なんですよ
お礼
ご回答ありがとうございます。 ご指摘のとおりで、自分は[]はtestコマンドの一部と勝手に解釈しておりました。 とても勉強になりました。
- vaguechat
- ベストアンサー率85% (47/55)
二つのif文について if test -e $i.$DATE.gz; then か if [ -e $i.$DATE.gz ]; then かのどちらかにするとどう?
お礼
ご回答ありがとうございます。 ご指摘のとおり、どちらかの記述に変更致します。 ありがとうございました。
お礼
とても分かりやすい回答、ありがとうございました。 tux_the_penguinさんからもご指摘を受けましたとおり、自分はこれを→[] testというコマンドの記述方法の一部だと勝手に解釈しておりました。 ありがとうございました。m(__)m