• ベストアンサー

シェルスクリプト構文で「もしファイルが存在しなかったら」を表すには?

シェルスクリプトのif文で「存在しなかったらthen節へ」の表現方法を伺っても宜しいでしょうか? 現状「存在するならthen節へ」を使い下のようにしています。 if [ -e XXXXX ]; then # XXXXXが存在しなかったら echo # 存在時は処理なし。が、構文不明の為、無意味なechoを入れてる else # 存在しない時の処理がここにある fi 上を自然な文法に修正したいです。以上どうか宜しくお願い致します。

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

  • ベストアンサー
  • Ceren
  • ベストアンサー率49% (90/183)
回答No.1

if [ ! -e XXXXX ]; then でうまくいきませんか? あと test(1) のmanpageも参考に。

simple0123
質問者

お礼

なるほど、C言語系のように!でいいのですね。有難うございます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

使うシェルとか「ファイルがないときの処理」にもよりますが, [ -e XXX ] || 処理 と || で逃げる手もありますね. あと, 「then のところに入れる処理がない」場合には if [ -e XXX ]; then : else 何か fi のように : を使うのが普通だと思います.

simple0123
質問者

お礼

捕捉情報、誠に有難うございます。今回は最も単純な方法である!を使う事で解決しました。

関連するQ&A

  • シェルスクリプトのif文

    シェルスクリプトのif文について質問です。 あるファイルが存在しないときだけ処理を行いたい場合、 下記のような記述をするしかないのでしょうか? if [ -e /tmp/test.txt ]; then  ダミー処理(val1=1など意味のない処理)  (ダミー処理を入れるのは何も書かないとエラーとなってしまうため) else   行いたい処理 fi elseを使わずに if  fi だけですますことはできないでしょうか? -eはファイルが存在するならば真なので 逆に意味が真となるようにしたいのですが・・・

  • シェルスクリプトのテスト

    年が変わるとシェルの処理も替わります。 例えば: year=`date +%Y` if [ $year=2006 ];then echo "year 2006" fi if [ $year=2007 ];then echo "year 2007" fi テストをしたいですが、 2007年のテストは出来ますでしょうか? 教えてください!お願いします。

  • 以降のスクリプトを実行せずに終わるシェルスクリプトの書き方

    Linux上で動かす以下のようなシェルスクリプトを作っています。 ▼------------------------------- if [ -d /home/aaa ]; then   処理1 else   処理2 fi 処理3 ▲------------------------------- この場合、/home/aaaが存在するかどうかに関わらず、 「処理3」は実行されてしまいます。 これを、 「/home/aaaが存在しない場合は処理2を行ってからスクリプトを終了する」 といった内容にしたいです。 現状はそれの書き方が見つからないので、処理1の次の行に処理3を書き込んで同じ結果にしています。 (そのためどんどんif文の階層が深くなり、全ての記述がif文の中に入っていく・・・) エクセルのVBAで言うところの、Exit Sub に該当する記述が理想的です。 そのような書き方がありましたら教えてください。

  • 【ど素人】シェルスクリプトで、引数の形式チェック【ヘルプミー】

    bashで書いたシェルスクリプトで、 引数を正規表現を用いて入力形式チェックしたいと思っています。 いい方法が思いつかず、とりあえず動作はする以下のスクリプトを 組みました。 echo $1 | grep "正規表現" > /dev/null if [ $? -eq 0 ]; then # あってるときの処理 else # ちがうときの処理 fi どうも、他に良い方法がある気がしてなりませんが、 どうでしょうか? 良い方法があれば教えてください。 また、(ないとは思うけど)この方法が一般的ということであれば、 その旨教えていただけるとありがたいです。 よろしくお願いします。

  • RedHatでのシェルスクリプトについて

    こんにちは。また質問させて下さい。 redhat7.0のシェルスクリプトで、 サンプルコード片手に以下のコードを記述しました。 やりたい事は、もしaaa.txtというファイルが存在したら その内容を表示させ、存在しなければその旨のメッセージを 表示させる、という単純なものです。 この時、ファイルが存在しない時に ./test.sh: /tmp/aaa.txt: No such file or directry というエラーになってしまいます。 エラーを抜けてメッセージを表示させるには どうしたらいいでしょうか。 アドバイスよろしくお願いいたします。 *********記述したコードです。************* #!/bin/bash fileName=/tmp/aaa.txt read varStr1 varStr2 <fileName if [ -a fileName ]; then echo {$varStr1} else echo{$fileName}{$varStr2} fi

  • シェルスクリプトで引数をファイル名に使うには?

    シェルスクリプトでutfとshift-jisの変換を行いたいと思ってます。 ファイル出力のところでファイル名を$1と引数にするとうまくいきません。(変換されてなかったり、空ファイルできたり) >! $1 ではなく $1.xx とかにするとうまくいきます。 どうしたら引数のファイル名に出力できるでしょうか? #!/bin/sh if [ $2 = 'us' ] then cp $1 $1.utf8 iconv -f UTF-8 -t SHIFT-JIS $1 >! $1 echo "$1 UTF-8 => SHIFT-JIS [ OK ]" elif [ $2 = 'su' ] then cp -f $1 $1.sjis iconv -f SHIFT-JIS -t UTF-8 $1 >! $1 echo "$1 SHIFT-JIS => UTF-8 [ OK ]" else echo "$1をコンバートできませんでした。" fi

  • シェルスクリプトで実行したらエラーが出てきてしまいます。

    今シェルスクリプトでネットにつないだらサーバへ転送するプログラムを作ってます。 下記のような感じでプログラムを作ってcygwinで試しに動かしてみたらなぜかエラーが出ます。 #!/bin/sh #ネットワークにつながっているか確認 if [ping www.yahoo.co.jp 64 2]; then echo "OK" exit 1 #つながっていないのでつながるまで確認 else sleep 10[s] until [ping www.yahoo.co.jp 64 2]; do sleep 10[s] done #バックアップ開始 rsync バックアップ元 バックアップ先 exit 1 fi pingでネットにつないでるか確認しつながっていたらそのまま終了し、 つないでなかったらつながるまで待ち つながったらバックアップするという簡単なプログラムです。 (初心者なもので本で見ながら作りました。単純なプログラムしか作れないので・・・) エラーは行17が文法エラーというのが返ってきます。 ちなみにfiの行です。 どこがだめなんですかね?? 自分的にはいい感じなんですが。笑 また下記のようなプログラムも書いてみましたがfiの行がエラーって出てきます。 #!/usr/bin/sh if ping www.yahoo.co.jp 64 2; then echo "OK" exit else echo "NG" exit fi 詳しい方がいましたらご教授をお願いします。 また上記と似たようなプログラムがある方はぜひ教えてもらえるとうれしいです。 勉強になりますので。 よろしくお願いします。 PC環境 Windows XP Home Edition cygwinを利用している

  • シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕

    シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕方が分かりません。 -------------------------------------------------- #!/bin/sh . GetYesNo.sh          #外部シェルスクリプトを読み込んで... GetYesNo $1           #このGetYesNoの戻り値は0か1を出力するようにする。 if[ ??? -eq 0 ]; then      #"???"の部分に何を入力すれば良いか分かりません。 echo "真(0)です。" else echo "偽(0以外)です。" fi -------------------------------------------------- 戻り値が0か1しか出力しない外部シェルスクリプトを読み込んで、その戻り値をtestコマンドを利用して、0か1のどちらかを判定して、それぞれの出力を出したいけれど、どうやって出来ますでしょうか。 色々な方法を試してみましたが、ダメでした。 上記のコードの書き間違いがあると思いますが、あったらご指摘をお願いします。

  • サーバー監視プログラム(シェルスクリプト)

    現在シェルスクリプトでpingによるサーバー監視をプログラムを作成しております。 そこで問題なのですが、応答がないマシンにpingを打つと永遠に終了しません。 スクリプト事態にTTLなど生存時間を設定するのか可能か? 一定時間のあと次の処理に進みたい場合はどうしたらよいか? 5秒応答がなかったら強制終了は可能か? 以下スクリプトです。 --------------------------------------------- #!/bin/sh host=192.168.1.2 ping -c 5 ${host} 1>/dev/null 2>&1 rc=$? if [ ${rc} -eq 0 ]; then echo "${host} is alive." else echo "${host} is not responding or network error." fi exit 0 --------------------------------------------- お願いします。

  • シェルスクリプト(if文)

    bashにてシェルスクリプトを作成しています。 XXXX_111122222333_YYYYMMDD 111122222333 といった2パターンのファイル名から、「111122222333」の部分を取得したいのですが、if文の条件式で悩んでいます。 if [ expr length ${p9} -gt 13 ] then a=`echo $p9|cut -c 6-9` b=`echo $p9|cut -c 10-14` c=`echo $p9|cut -c 15-18` else a=`echo $p9|cut -c 1-4` b=`echo $p9|cut -c 5-9` c=`echo $p9|cut -c 10-13` fi これで実行すると too many arguments というエラーが出てしまいます。(結果も正しくありません) 基本的な部分が理解できていないかと思うのですが、宜しくお願いいたします。