• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ある特定のフォルダの中に、2つの圧縮ファイルが存在すれば、bbb.lo)

シェルスクリプトのエラーに対する解決方法

このQ&Aのポイント
  • 質問者は特定のフォルダ内に2つの圧縮ファイルが存在する場合、bbb.log.1を削除し、存在しない場合はメッセージを表示するシェルスクリプトを作成しました。
  • しかし、実行すると「./test.sh: line 15: [: -e: binary operator expected」というエラーが表示されます。
  • 正しく動作させるためには、if文の条件式を正しく記述する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.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を指定するか、コマンドをフルパスで書くか、してください。

murakenjapan
質問者

お礼

とても分かりやすい回答、ありがとうございました。 tux_the_penguinさんからもご指摘を受けましたとおり、自分はこれを→[] testというコマンドの記述方法の一部だと勝手に解釈しておりました。 ありがとうございました。m(__)m

その他の回答 (2)

回答No.2

#1の方もおっしゃっていますが [ ← この文字は見やすくするための記号ではなく test と言うコマンドの別表記なんですよ

murakenjapan
質問者

お礼

ご回答ありがとうございます。 ご指摘のとおりで、自分は[]はtestコマンドの一部と勝手に解釈しておりました。 とても勉強になりました。

  • vaguechat
  • ベストアンサー率85% (47/55)
回答No.1

二つのif文について if test -e $i.$DATE.gz; then か if [ -e $i.$DATE.gz ]; then かのどちらかにするとどう?

murakenjapan
質問者

お礼

ご回答ありがとうございます。 ご指摘のとおり、どちらかの記述に変更致します。 ありがとうございました。