dポイントプレゼントキャンペーン実施中!

ある特定のフォルダの中に、2つの圧縮ファイルが存在すれば、bbb.log.1を削除し、存在しなければその旨をmessagesに記述するというシェルスクリプトを作成しました。
(OSはCentOS5.4で、cronで作成したシェルスクリプトを動作させております)


<シェルスクリプトの内容>
#!/bin/sh

DATE=`date +%Y%m%d --date '1 day ago'`

i=/var/log/aaa/bbb.log
j=/var/log/aaa/ccc.log

cat $i.1 | grep type=ccc > $j.$DATE
sed '/type=ccc/d' $i.1 > $i.100

/bin/mv $i.100 $i.$DATE
/bin/gzip $i.$DATE
/bin/gzip $j.$DATE

if [ test -e $i.$DATE.gz ]; then
if [ test -e $j.$DATE.gz ]; then
rm -f $i.1
else
logger -p user.info "not find ccc.log"
fi
else
logger -p user.info "not find bbb.log"
fi

これを実際に動作させますと、以下のエラーが表示されます。
./test.sh: line 15: [: -e: binary operator expected

どのように記述すれば正しく動作するのでしょうか。
お手数をおかけしますが、よろしくお願い致します。

A 回答 (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を指定するか、コマンドをフルパスで書くか、してください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/06/30 11:41

#1の方もおっしゃっていますが



[ ← この文字は見やすくするための記号ではなく
test と言うコマンドの別表記なんですよ
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/06/30 11:42

二つのif文について



if test -e $i.$DATE.gz; then



if [ -e $i.$DATE.gz ]; then

かのどちらかにするとどう?
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/06/30 11:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!