• ベストアンサー
  • 暇なときにでも

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文で一発判定をしたいと思っているのですが、正しい記述方法を教えてください。 よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数6
  • 閲覧数1107
  • ありがとう数4

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連する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

  • 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: 未定義の変数

その他の回答 (5)

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からの補足

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からの補足

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からの補足

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

関連するQ&A

  • シェルスクリプトの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]+は長すぎるので何とかしたいのです 何かいい方法はないでしょうか? よろしくお願いします

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

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

  • 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 +-*/が入った時にエラーを出したいのですが+-*/をどう判定したらよいのか教えて頂けます様お願い致します。

  • セルの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個 だし?) といった ことで お手数ですが

  • 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にもしてみましたが動きませんでした。 何が原因でエラーが出ているのかが分かりません。 宜しくお願いします。

  • cshが詳しい方は教えてください

    cshが詳しい方は教えてください cshで、ソラリスOS上にtmp.outってのファイルを行ずつに読み込みしたいんですが foreach f_list("`cat tmp.out`") echo "${f_list}" end tmp.outの内容は以下です。 test3 if ( 0==mencmp("H",HOSTN,10) { test345 testddd … 2行目の最後"{"っての文字があれば、実行すると、うまくいけませんが。 『}が足りません。』ってのエラーになっちゃう、 "{"がcsh中で、特殊の文字と思ってますが、cshが詳しいかは対処方法を教えてくれませんか 以上です。よろしくお願いいたします。

  • Bash スクリプトでファイルの検出方法を教えてください。

    ファイルやディレクトリが無いこと(消去できたこと)を、検出したいと思います。 試しに、次のプログラムを作ってみました。 f_chk() { if [ -f "$1" ]; then echo $1 "ファイルはあった → NG" return 1 else echo $1 "ファイルは無かった → OK" return 0 fi } f_chk "/mnt/hoge/*.INF" exit ------------------------------- "if [ -f "$1" ];"でファイルの有無を判定させようとすると、明確にファイル名を指定しなければ成りません。 今、ファイル名の指定を「*.INF」とすると、正しい判定をしません。 これに変わる方法を教えてください。

  • UNIX Cシェルで実数の比較

    UNIX Cシェルで実数の比較がしたいのですが、 うまくいきません 以下のような結果になります。 うまく判定するにはどうすればよいのでしょう #!/bin/csh -f set CONSIZE=-0.01 echo "CONSIZE = $CONSIZE" @ CONSIZE = $CONSIZE if( $CONSIZE < 0.0 )then echo " 0以下;;; $CONSIZE" exit endif 実行 CONSIZE = -0.01 @: 数値形式が正しくありません。