• ベストアンサー

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

naturalの回答

  • natural
  • ベストアンサー率37% (419/1115)
回答No.1

私はbashではなくshで記述するので該当するかどうか判りませんが、if文に-fを用いてみては如何でしょう。 bashだとこうなるのでしょうか。 if [ -f /tmp/aaa.txt ]   fileName=/tmp/aaa.txt else   ファイルが存在しない場合の処理 fi -fを用いるとそのファイルが存在するかどうか確認できますので、確認できたらfileNameに設定すれば良いと思います。 そうしないとread時にfileNameで指定されたファイルが存在しないのでエラーになってしまうのでしょう。

bunnyLove
質問者

お礼

naturalさん、回答ありがとうございます。 なるほど、確かにご指摘のとおり、ファイルが無いのに readしてますよね。とほほ。 -fっていうのも使えるみたいですね! どうもありがとうございました。 また何かありましたら教えてください。 助かりました!

関連するQ&A

  • RedHatのシェルスクリプトで・・・・

    こんにちは。何度もすみません。また質問させて下さい。 RedHat7.0でシェルスクリプトを作成しているのですが、 初心者の為(Linux自体よくわかってません)悪戦苦闘中です。 今回つまづいたのは、 #!/bin/bash FName=/home/my/aaa.txt read str1 str2 str3 <$FName とした時、まず、実行している場所が /tmp な為、FNameに/home/myとやるとファイルがありません、 と言われてしまいます。 ../home/myでもだめなんですね~・・・どうしてでしょう・・・。 もうひとつ、 aaa.txtの中身に記述されているデータが、空白区切りの時は うまくstr1 str2 str3に値が入ってくれるのですが、 カンマ区切りデータが入っていると値が入ってくれません。 自分なりに調べて-dを使うと出来るっぽい所までは わかったのですが、具体的な使い方がいまいちわからないのです。 read str1 str2 str3 <$FName -d, なんて書いてみたのですが・・・全然だめのようです。 なかなか良いサンプルコードが見つからなくて・・・。 すみませんが、アドバイスいただけたら、と思います。 宜しくお願いいたします。

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

    /bin/shで標準出力エラーを画面に出力せずにファイル数を変数に格納することはできますか? (質問) /tmp配下にaaa,aaa1,bbb,cccのファイルがあるとします。 aaaを含むファイル数を取得する場合以下で取得可能かと思います。 filenum=`ls -l /tmp/aaa* | wc -l` echo $filenum filenumの結果として2が得られる思います。 /tmp配下に存在しないgggのファイル数を取得する場合、標準エラーが表示されてしまいます。 filenum=`ls -l /tmp/ggg | wc -l` echo $filenum 画面上にgggというァイルがない旨のエラーが出力されてしまいます。 画面上にエラー出力されずにfilenumに0が取得できるようにするにはどのようにすればよいでしょうか。 また、同一のコマンドラインでファイルが存在する場合はそのファイル数が取得できるようにしたいです。 よろしくお願いします。

  • RedHatのShellScriptについて

    初めて投稿します。よろしくお願いします。 RedHat7.0でShellScriptを作成しています。 初めて作るのでよくわかっていません。 下記スクリプトを実行すると、 ./test.sh:aaa:command not found とエラーになります。 原因がおわかりの方、アドバイスをいただけないでしょうか。 よろしくお願いいたします。 ******test.shの内容***************** #!/bin/bash . /tmp/test.txt para=$1 export para echo $para ************************************ ***test.txtの内容******************* aaa *********************************** ********やりたい事***************** 変数paraにtest.txtに定義されている値を 代入して表示したい。 ********************************** 権限はどちらのファイルも chmod 777 test.sh chmod 777 test.txt に設定してあります。 回答よろしくお願いいたします。

  • シェルスクリプトの作り方

    OSはVineで、bashシェルです。 シェルスクリプトの作り方ですが、 1.ファイルを作る。 例えば、 #!bin/sh cd tmp このとき、ディレクトリはどこでもいいのでしょうか? 2.権限を付ける。 chmod u+x filename 3.実行 ./filename 他に気をつけることはないでしょうか? 実行すると、 bash: ./filename: bad interpreter: そのようなファイルやディレクトリはありません となってしまって、どうしても実行できません。

  • シェルスクリプト

    2月14日頃質問のあった”UNIXのシェルスクリプトを使用してテキストファイルのある列にある特定の文字列を条件としてその行を出力するということをやりたい”を下記のように作ってみました。問題ないか逆質問の形で投稿します。(ルール違反かもしれませんが質問が締め切られているので・・・) #!/bin/bash CAT=YAHOO while read LINE do echo $LINE > tmp.txt DOG=`cut -d" " -f2 tmp.txt` if [ "$CAT" = "$DOG" ] then echo "$LINE" fi done < catalog.file

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

    bangou.txtには ▲ 123123 123123 100000 ▲ ▲ というように数値が入っています。(▲は空白ですが改行コードがはいってます) この場合、1行目と3行目を比較するスクリプトを作りたいと思って 色々調べて以下のようなスクリプトを作ってみましたけどうまく動きません。 #!/bin/bash for iii in `sed -n '1p' bangou.txt` do jjj=`sed -n '2p' bangou.txt` kkk=`sed -n '3p' bangou.txt` #declare -i $kkk if [ "$kkk" = "$iii" ] then echo "$iii" else echo "$kkk" fi done どこか基本的なところで間違えているのかと思うのですが初心者なので よくわかりません。 わかる方がいらっしゃったら教えていただけないでしょうか。

  • シェルスクリプトの問題で困っています!

    シェルスクリプトの問題を解いているのですが、いまいち分かっていないところが多いです… X 年からY 年までのカレンダーをファイル(cal-年.txt)に出力するシェルスクリプト(mkcal.sh)を 作成せよ。 実行書式./mkcal.sh x y [必須項目] 1. ファイル作成と同時にメッセージを出力し,作成したファイルが分かるようにすること。 出力例 ./mkcal.sh 2010 2012 Making cal-2010.txt Making cal-2011.txt Making cal-2012.txt 2. 作成しようとしているファイル(cal-XXXX.txt)が既に存在する場合には,エラーメッセージ File exists: cal-XXXX.txt を表示して,ファイルを作成しないこと。 出力例(cal-2011.txt が存在する場合) ./mkcal.sh 2010 2012 Making cal-2010.txt Making cal-2011.txt File exists: cal-2011.txt Making cal-2012.txt [自由項目] 1. mkcal.sh の引数を3 つ与えて実行すると,z 年飛ばしでカレンダーを出力すること。 実行書式./mkcal.sh x y z という問題に対し #!/bin/sh n=$1 while [ $n -le $2 ]; do echo "Making cal-$n.txt" /usr/bin/cal $n > cal-$n.txt n=`expr $n + 1` done #!/bin/sh n=$1 while [ $n –le $2 ]; do echo "Making cal-$n.txt" if [ -f "cal-$n.txt" ]; then echo "File exists: cal-$n.txt" else /usr/bin/cal $n > cal-$n.txt fi n=`expr $n + 1` done #!/bin/sh n=$1 while [ $n –le $2 ]; do echo "Making cal-$n.txt" if [ -f "cal-$n.txt" ]; then echo "File exists: cal-$n.txt" else /usr/bin/cal $n > cal-$n.txt fi n=`expr $n + $3` done とやっているのですが、どこで保存をすればいいか、そもそもの保存をするコマンドが分かっていない、これは合っているのか…と色々と問題点があります 誰か助けてください…お願い致します

  • シェルスクリプトについて教えてください

    以下のようなフォルダ構成があります。 /var/tmp/組織コード/log このlogディレクトリ配下に0byteのファイルがたくさんあり、それを全て定期的に削除したいと思っています。 また、同ディレクトリにはそれ以外のファイルやフォルダも入っていて、それらは絶対に削除してはいけないものです。 以下のようなコマンドを考えたのですが、なにか懸念される点はあるでしょうか? find /var/tmp/*/log -size 0c -exec rm {} \; いろいろ調べたのですが、Linux系は初心者のため、これで妥当かどうか不安なのです。 環境はSolaris11で、bashです。 「組織コード」の部分を固定値にしてコード数分コマンドを書けば確実だとは思いますが、組織コードが増えたり変わるたびにシェルにもメンテが必要になるので、イマイチだと思っています。 詳しい方、ぜひアドバイスしていただけないでしょうか。 よろしくお願いします。

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

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

  • シェルスクリプトの記述について

    UBSメモリをディレクトリusbにマウントし、 そのUSBメモリの中に特定のファイルaaaがあればechoで文字を表示する、 という記述をしたいです。 cd /home/user/ mkdir usb sudo /dev/sda1 ./usb if [ -x home/user/usb/aaa ]; then   echo "aaa ari" else   echo "aaa nai" fi 以上を実行すると、aaa nai が表示されてしまうのですが、何故でしょうか。 実行後に/home/user/usbフォルダを見てみると、マウントには成功しています。 勿論USBメモリの中にはファイルaaaはあります。 aaaには実行権が付いているので、ifの後に -x をつけています。 Linux上で, vi aaa sudo cp aaa ./usb のようにaaaファイルを作成してUSBメモリの中にコピーすると、何故か実行権が付いてしまうので、  if [ -f ~~ だったものを  if [ -x ~~ に変更しました。