こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ある特定のフォルダの中に、2つの圧縮ファイルが存在すれば、bbb.lo

ある特定のフォルダの中に、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

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

投稿日時 - 2010-06-29 14:03:06

QNo.6003596

すぐに回答ほしいです

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

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を指定するか、コマンドをフルパスで書くか、してください。

投稿日時 - 2010-06-29 19:53:30

お礼

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

投稿日時 - 2010-06-30 11:41:27

ANo.3

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(3)

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

[ ← この文字は見やすくするための記号ではなく
test と言うコマンドの別表記なんですよ

投稿日時 - 2010-06-29 19:39:40

お礼

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

投稿日時 - 2010-06-30 11:42:42

ANo.1

二つのif文について

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



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

かのどちらかにするとどう?

投稿日時 - 2010-06-29 19:30:16

お礼

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

投稿日時 - 2010-06-30 11:44:20

あなたにオススメの質問