• ベストアンサー

cshの条件式について教えてください

cshで該当ディレクトリにファイルがなければOK、あればエラーというような処理をしようと思っています。 しかし、下記のような記述ではうまくできません。 1) *************************** if ( -e $DIR/*.* ) then echo "NG" exit 1 else echo "OK" endif exit 0 *************************** if文でなく、外にだせばうまくいくのですが... 2) *************************** test -e $DIR/*.* if($status == 0) then echo "NG" exit 1 else echo "OK" endif exit 0 **************************** if ( test -e $DIR/*.* ) then... でもだめでした。 どうにかしてif文で一発判定をしたいと思っているのですが、正しい記述方法を教えてください。 よろしくお願いします。

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

  • ベストアンサー
noname#88056
noname#88056
回答No.6

一発判定ではなくても、警告が出なければ良いんですよね? *************************** set FILE = (`ls $DIR | grep *`) if ( $#FILE != 0 ) then echo "NG" exit 1 else echo "OK" endif exit 0 *************************** これなら警告でないはずです。

steel_50130
質問者

お礼

ありがとうございます。 確かにその方法だと警告はでませんね。 私がやった方法は同じようにlsコマンドを使用しますが、 lsの結果をファイルにリダイレクトして、ファイルサイズを0かどうか判断する、という方法でした。 でも、sgt_lkさんの方法だと余計なファイルも作成しないのでこちらのほうがいいですね。 ありがとうございました。

その他の回答 (5)

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.5

#4です。{ の後と } の前に空白を空けてください。 ただこれは、#4で書いたとおり、2)の「test -e $DIR/*.* が上手く行く場合」という条件付です。これって、ファイルが無いときは警告メッセージが出て、複数個あるとエラーになりませんか? if({ true $DIR/*.* }) then だと、ファイルが複数個あってもOKですが、ファイルが無いと警告メッセージが出ます。

steel_50130
質問者

お礼

おっしゃるとおり空白をあけるとできました。 ありがとうございます。 >これって、ファイルが無いときは警告メッセージが出て、>複数個あるとエラーになりませんか? 複数ファイルでエラーにはなりませんが、確かにファイルがないと警告がでます。実はそれがいやだったのでif文の中に組み込めばそれがなくなるかなと思ったのです。 でも結果的にはif文に組み込んでも警告メッセージがでてしまいました。。。 ただ文法的にはこちらのほうがきれいなので教えていただいたやり方を使おうと思います。

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.4

手元に環境が無いので試せませんが、 >test -e $DIR/*.* >if($status == 0) then で上手く行くなら、 if({test -e $DIR/*.*}) then でいけるはずです。{ } の意味については、man csh の式の節の演算子の後あたりに書いてあります。

steel_50130
質問者

補足

回答ありがとうございます。 >if({test -e $DIR/*.*}) then で試しましたが、 }がありません。といったメッセージが表示され、エラーになってしまいました。 csh manを読むと確かに{}を使用して実行できそうなのですが。。。

  • ken__t
  • ベストアンサー率41% (53/129)
回答No.3

すみません。確かに参考で述べた方法ですと${DIR}ディレクトリのチェックにしかならないかも知れません。 最後の手段!!これでどうでしょうか? if( `ls -1 ${DIR}/ | wc -l` != 0 ) then なんとなく汚くなってしまいましたがこれが精一杯のような気がします。(自分がですが。。。) いかがでしょうか?

steel_50130
質問者

お礼

ありがとうございます。 確かにこれだとうまくいきますね。 う~ん。if文のなかで解決しようとするとやはりこういったやり方になってしまいますよね。 ありがとうございました!!

  • ken__t
  • ベストアンサー率41% (53/129)
回答No.2

#1です。 確認しました。 Bシェルの場合であれば、1)の条件式で正常に動作しました。 Cシェルでは”*.*: 曖昧”ですと怒られました。 Cシェルは融通が利かないところがあるので悩むことが多かった記憶があります。 単純にこれではどうでしょうか? if( -e ${DIR}/ ) then ${DIR}配下のファイルの存在確認だけであればこれでも良いとおもいます。

steel_50130
質問者

補足

回答ありがとうございます。 if( -e ${DIR}/ ) then にて試してみましたが、ファイルが存在しなくても条件は真となってしまいました。 つまり1)の例でいえば"NG"となってしまいました。 そちらの環境ではうまく動作したのでしょうか? だとすればこちらの環境に問題があるのかもしれませんが。。

  • ken__t
  • ベストアンサー率41% (53/129)
回答No.1

はじめまして。 1)のif ( -e $DIR/*.* ) thenをif( -e $DIR/*.* ) then にしてみては如何ですか? ※ifの直後のスペースを削る。 それでも駄目な場合は、$DIR/*.*を"${DIR}/*.*"としてみる。 現時点で確認できる環境がありませんので、間違っていたらごめんなさい。 明日以降でしたら確認が取れます。 中途半端でごめんなさい。

steel_50130
質問者

補足

はじめまして。回答ありがとうございます。 しかし回答のとおりやってみましたが、だめでした。 *(アスタリスク)はこのようなケースでは使用できないのでしょうか?

関連するQ&A

  • if文について

    cshで書いています。 if文がとおりません。。。 0: Event not found. このようなメッセージが出力されます。 if ($flg == "xxx") then echo "aaa" else if($flg == "yyy") then echo "bbb" exit else echo "ccc" exit endif 内容は上記のような感じです。 どなたか教えて下さい。

  • NTのバッチを会話形式にしたい

    WindowsNT4.0(SP6)で、バッチファイルを作ろうと思っています。 会話形式で標準入力からの入力待ちで処理を止めたいのですが、どうしたらいいのでしょうか? Solarisなら下のような感じなのですが、Windowsではどうやったらいいのかわかりません。 どうか教えてください。 Solaris(csh)の場合・・・ #!/bin/csh echo -n "年齢入力" set innum=$< # if ($innum < 19)then echo "あなたは成人ではありません" else echo "あなたは成人です" endif exit

  • vbsのif文で複数条件の判定

    例えば以下である場合、 WScript.echo AAA WScript.echo BBB vbsを実行すると "?"が表示されます。 "OK"が表示されない原因として考えられる事はありますでしょうか If AAA = false Then If BBB = false Then WScript.echo "OK" else WScript.echo "NG" End If else WScript.echo "?" End If

  • シェルプログラムの判定について

    皆さんのお知恵をお貸しください シェルはcshです 目的set name = $<で$nameに入る文字が+-*/(一文字毎です)の時エラー処理をしたい 現状下記のプログラムですが判定出来ません set xx = $< set moji = `grep -c '[\-\+\*\/]' xx` if ( $moji == 1 ) then echo 文字に誤りがあります endif  else if ( $moji == 0 ) then echo OKです endif +-*/が入った時にエラーを出したいのですが+-*/をどう判定したらよいのか教えて頂けます様お願い致します。

  • cshでファイルサイズ取得

    ヤマトです。 cshでファイルのサイズを取得したいのですが、分かりません。 環境はRed Had Linux7.2です。 hoge.txtのファイルサイズが0バイトの場合、処理を行うという事をやりたいのですが・・・ =======SAMPLE====== if ( hoge.txtのファイルサイズ = 0 ) then echo "サイズは0バイトです。" endif 教えて頂けると有り難く思います。宜しくお願いします。

  • csh(Cシェル)のevalに関して

    evalを用いてインクルード的な事を行いたいのですが、「コマンドが見つかりません」が出てきて困っています 原因はなにがあるのでしょうか? 色々ネットで調べて同じように記述したつもりなのですが csh初心者で申し訳ありませんが 使い方が悪いのか、環境が悪いのか?判断できません 環境は別の人に作って貰ったんで、環境なら環境から勉強していきたいと考えてます ■TEST010.csh #!/bin/csh echo "TEST010-Step0010" eval `./TEST000.csh` echo "TEST010-Step0020" echo " set root_path $root_path;" echo "TEST010-Step0090" ■TEST000.csh #!/bin/csh set lcmoji01 = /export/home/tbn/km echo "set lcmoji01 $lcmoji01;" ■実行結果 > csh TEST010.csh TEST010-Step0010 ^M: コマンドが見つかりません。 TEST010-Step0020 lcmoji01: 未定義の変数

  • cshでのリンクファイルの存在確認方法

    cshで if (-f ***) then endif とすると *** というファイルが存在するかどうか調べられますが、*** というファイルが、リンクファイルかどうか調べるにはどうすればよいですか?

  • system関数で呼びだした、cshファイル周辺でのエラー

    2~3日前にも質問させていただいた、Perl初心者leeeeeeeeです。先日に引き続き、前の業者が作ったPerlプログラムを、新しいサーバ上で動くようにする作業を行っているのですが、まだエラーが出ており困っています。以下が問題の部分です。 ○○.cgi # 削除シェルの実行 $rtn = system"$rm_csh $tmp_file $limit_date $touch_file"; if($rtn != 0) {  # エラーログ出力  cm_errlog(__FILE__, "LOG013", ($rm_csh." ".$limit_date));  # エラーHTML出力  省略  # 異常終了  exit 1; } ここの、$rtnが、0になっていないようで、エラーページが表示されてしまいます。 ちなみに、$rm_csh は、tmpdel.cshというファイルで、以下が中身です。 ■ tmpdel.csh #!/usr/bin/csh set touch_fname = $3 set tmp_file = $1 touch -t $2 $touch_fname >& /dev/null set STS = $status if( $STS != 0) then exit 1 endif foreach file_name (`ls $tmp_file*`)  test $file_name -ot $touch_fname && rm $file_name >& /dev/null end exit 0 ■ tmpdel.csh の #!/usr/bin/csh という部分が気になって、#!/usr/bin/perlとか、 #!/bin/cshにもしてみましたが動きませんでした。 何が原因でエラーが出ているのかが分かりません。 宜しくお願いします。

  • シェルスクリプトのifでの正規表現で\wが利用不可

    なのですがどうすればいいでしょうか? 端末で x=a.out;if [[ $x =~ \.\w+$ ]];then echo ok;else echo ng;fi ng となり\wが使えません 一方 x=a.out;if [[ $x =~ \.[0-9a-z]+$ ]];then echo ok;else echo ng;fi ok です \wの代わりに[0-9a-z]+は長すぎるので何とかしたいのです 何かいい方法はないでしょうか? よろしくお願いします

  • セルのIF分の質問です

    セルに入れる IF分を 教えてください NGを 分解してみたのですが・・・・ =IF(N3=1,then     -M2, else     IF(K2=1, then       IF(M2<P3-M3, then          M2      Else         P3-M3,       endif      else          IF(K2=-1,then           IF(M2<M3-P3,then               M2,           Else               M3-P3,            endif         else            0         endif)       endif) endif) N3 は 1 もしくは 0。 K2 は 1,-1,0 の3通りです IF が 5個ですから ) も 5個?(ENDIF も 5個 だし?) といった ことで お手数ですが

専門家に質問してみよう