• ベストアンサー
  • 困ってます

Linuxのシェルについて

いつもお世話になっております。 Linux(redhat)でのシェルスクリプトを作成したいと思いますが、あるコマンドを実行して実行成功したか失敗したかをstatusで拾う形にしたのですがうまくいきません。アドバイスをお願いします。 例: #!/bin/sh set ST = $status date ←コマンド if [ $ST == 0 ]; then echo "**************" echo "* o k *" echo "**************" exit $NORMAL else echo "**************" echo "* N G  *" echo "**************" exit $ABEND fi

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

  • 回答数2
  • 閲覧数511
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.1
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)

>if [ $ST == 0 ]; then を if [ $? = 0 ]; then >set ST = $status は、不要だし、もしやるとしてもコマンドの後でないと意味がない コマンドの実行成功不成功は $? に(0|1で)入ります ==は=の間違いだと思います (bashの場合)

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

質問者からのお礼

ありがとうございます。 非常に為になりました。これからも勉強いたしますので宜しくお願い致します。

関連するQ&A

  • シェルの -eq の動作について

    シェルの -eq の動作について質問があります。 次のプログラムの動作を例に挙げます。 【ファイル名:A.sh】 #!/bin/sh readonly A=666 B=A echo $B if [ $B -eq 666 ]; then echo XXXXXXX exit 0 fi 「実行方法」 sh B.sh 「実行結果」 A XXXXXXX 【ファイル名:B.sh】 #!/bin/sh readonly A=666 B=A echo $B if [ $B -eq 667 ]; then echo XXXXXXX exit 0 fi 「実行方法」 sh B.sh 「実行結果」 A -Question- A.shを実行すると、処理がif文に入ってしまう理由を教えてください。 変数Bが二重参照しているような気がするのですが、 そのような機能が sh にあるのでしょうか?

  • prコマンドについて

    prを使ってダブルカラムでプリントする入力フィルタのシェルスクリプトなんですが、 #!/bin/sh -f   ※1 if [ $1 = '-c' ] ; then shift fi if pr -2 -h "'date'($5@$7)" $2 $1  ※2 then exit 0 else exit 2 fi ※1の-fというオプションの意味と、 ※2の"'date'($5@$7)" $2 $1がよくわかりません。 $はパラメータの列番号かと思いますが、それがどのように利用されているのか、@の意味が何なのか、教えていただけないでしょうか。

  • シェルの -eq の動作について

    シェルの -eq の動作について質問があります。 次のプログラムの動作を例に挙げます。 【ファイル名:A.sh】 #!/bin/sh readonly A=666 B=A echo $B if [ $B -eq 666 ]; then echo XXXXXXX exit 0 fi 「実行方法」 sh B.sh 「実行結果」 A 【ファイル名:B.sh】 #!/bin/sh readonly A=666 B=A echo $B if [ $B -eq 667 ]; then echo XXXXXXX exit 0 fi 「実行方法」 sh B.sh 「実行結果」 A -Question- A.shがif文に入ってしまう理由を教えてください。 変数Bが二重参照しているような気がするのですが、 そのような機能がshにあるのでしょうか? あと、もう一つ質問があります。 このシェルを古いバージョンで実行すると、  A.sh: line 8: [: A: integer expression exprected というエラーが出てしまいます。 これについても、わかる人がいましたら教えてください。

その他の回答 (1)

  • 回答No.2
  • notnot
  • ベストアンサー率47% (4590/9635)

なんか変な参考書を読んだようですね。 if コマンド then コマンドが成功したときの処理 else コマンドが失敗したときの処理 fi を使います。 NORMAL=0 ABEND=1 if date then echo "**************" echo "* o k *" echo "**************" exit $NORMAL else echo "**************" echo "* N G  *" echo "**************" exit $ABEND fi

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

関連するQ&A

  • Linuxシェルスクリプトを新しいコマンドにしたい

    Linux初級者です。よろしくお願いします。 OSにFedora Core 10, シェルにtcshを使用しています。 よく使用するコマンドを、まとめて一括で実行するように、 新しいコマンドを作成したくて、次のようなことをしていたのですが (1)ホームディレクトリにmybinというディレクトリを作成してPATHを通す。 (2)newbin1という以下の内容のシェルスクリプトを作成して、~/mybinに置いておく。 ================================== #!/bin/tcsh -f date #実行コマンド例1 echo $PATH #実行コマンド例2 ================================== (3)chmodコマンドでファイルに実行権限を与える。 上記のような方法で、作成したシェルスクリプト(newbin1)を PATHの通ったディレクトリ(~/mybin)に置いて、 > newbin1 とコマンドを呼び出しても、 "newbin1: コマンドが見つかりません" というエラーになってしまいます。 > which newbin1 とすると、ちゃんとファイルのパスが表示されるのですが、 *********************************************************** 自分で作成したシェルスクリプト(newbin1)を、 新しいコマンドとして認識させるにはどのようにすればよいのでしょうか。 また、そもそもシェルスクリプトを新しいコマンドにすることが 不可能だったりするんでしょうか? ************************************************************ 一括で実行したいコマンドが多い場合に、aliasで割り当てるのが大変なので、 できればaliasコマンドは使わずにできる方法を探しています。 基本的な質問かもしれませんが、よろしくお願い致します。

  • sqlplusの操作をシェル上で

    RedhatLinuxのシェルスクリプト上で Oracleのsqlplus操作を行うことは可能でしょうか? その場合、どのように記述すればよいでしょう? やりたい内容の例としては以下になります。 #!/bin/sh su -<oracleユーザー> sqlplus ※※※※ SQL> update ※※※ set ※※※ SQL> exit 上のような内容をcronに登録して自動処理をかけたいと考えています。

  • シェルの中からシェルを呼び出して判定

    UNIXで以下のようなシェルが動作しております。 #!/bin/sh su abcdef -c './GHI'; err=$? if [! $err -eq 0 ] then echo エラーが発生しました fi exit このシェルは「abcdef」ユーザに移ってカレントディレクトリのシェルコマンド「GHI」の結果を判定するというものです。 UNIX上では問題なく動作しております。 これをLinuxでそのまま動作させると「err」に「su abcdef」というユーザ切替コマンド自身の正否を格納しているようです。 「'」でくくられた範囲内で結果をファイルに格納したりして、その後ファイルの中を見て判断するとうまくいくことは分かっておりますが、出来たらファイルなど使いたくありません。 このような場合、みなさんどうしてるんでしょうか? よく出てくるパタンだと思うのですがどうしても良い対処が見つかりません。 どうか宜しくお願いします。 Linuxは「miracle-Linux2.0」というOSです、いわゆるRedHat系です。

  • Linux の shell プログラミングについて

    すみません、どなたがご存じでしたら教えてください。 Linux の shell プログラミングですが、 実行するコマンドをそのまま表示する良い方法が無いでしょうか? 現在は実行するコマンドをechoで書いています。 たとえば次のような感じです。 #!/bin/bash var1=/etc echo 'ls -l $var1 | wc -l' ls -l $var1 | wc -l 結果 ls -l $var1 | wc -l 205 でも(echoで)同じ内容を2行書きたくないので いろいろ調べて次のようにしてみました。 #!/bin/bash var1=/etc set -x ls -l $var1 | wc -l set +x 結果は + ls -l /etc + wc -l 205 + set +x 思ったようになりませんでした。 他に良い方法が何かありますでしょうか? よろしくお願いいたします。

  • expectでコマンド実行結果を変数に代入出来ない

    test.sh #!/bin/sh expect -c " set timeout -1 spawn telnet $1 expect "login:" ; send \"username\r\" expect "sword:" ; send \"password\r\" expect ${1} ; send \"start shell\r\" expect ${1} ; send \"set val=`date +%Y'-'%m%d`\r\" expect ${1} ; send \"echo $val\r\" expect ${1} ; send \"exit\r\" expect ${1} ; send \"exit\r\" exit " 例えばリモートホスト側で コマンド date +%Y'-'%m%d の実行結果を valに代入したいのですが 代入結果をechoコマンドで表示させても上記コマンド実行結果が 変数に代入されていないのか何も表示されません リモートホストに変数valを表示させるのがうまくいっていないんじゃないかと 思うのですが特殊文字($val)を正しく変数として解釈させる方法をご教示いただけませんでしょうか?

  • 3分間シェルを実行する方法

    netstat の結果をログ出力する為、次のようにシェルを作成しましたがもう少し効率の良い方法はありませんでしょうか。 ■作成したシェルスクリプト ------------------------------------------------------------------------------- #!/bin/bash #ログの出力先 LOGFILE=/var/log/netstat.log #実行コマンド date "+%Y/%m/%d %H:%M:%S" >> $LOGFILE netstat -ao >> $LOGFILE sleep 30 #実行コマンド date "+%Y/%m/%d %H:%M:%S" >> $LOGFILE netstat -ao >> $LOGFILE sleep 30 #実行コマンド date "+%Y/%m/%d %H:%M:%S" >> $LOGFILE netstat -ao >> $LOGFILE sleep 30 #実行コマンド date "+%Y/%m/%d %H:%M:%S" >> $LOGFILE netstat -ao >> $LOGFILE sleep 30 #実行コマンド date "+%Y/%m/%d %H:%M:%S" >> $LOGFILE netstat -ao >> $LOGFILE sleep 30 #実行コマンド date "+%Y/%m/%d %H:%M:%S" >> $LOGFILE netstat -ao >> $LOGFILE sleep 30 -------------------------------------------------------------------------------

  • シェルスクリプト(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のどちらかを判定して、それぞれの出力を出したいけれど、どうやって出来ますでしょうか。 色々な方法を試してみましたが、ダメでした。 上記のコードの書き間違いがあると思いますが、あったらご指摘をお願いします。

  • UNIXシェルプログラミング間違い探してくださる方。。。

    UNIXシェルプログラミング間違い探してくださる方。。。 わかりません、実行できません、おねがいします 知識浅いので"ハア?"って思うかも・・^^; trashという名のフォルダにいらないファイルを移動(sh プログラム名 ファイル名 で) すでに同名のファイルがあればファイルの最後にdをつける(なんでもいいんですが、) dがついてるファイルがすでにあるならddをつける #!/bin/sh trashname="$1" error=0 cd trash/ || exit 1 #trashへ移動 while : do if [ test -f "$trashname" && "$error" -le "10" ];then #10回エラーしたら終了 trashname="trashname""d" #名前→名前d error=`expr $error + 1` echo "$error" else break fi echo "No match" done if ($error -gt 10);then echo "$trashname :EROOR" else mv ../"$1" "$trashname" echo "Congratulations." fi

  • シェルについて

    Linuxにパッケージをインストールした後に、パッケージがちゃんとインストールされているかと確認するというrpmcheck.shを下記に作成したのですが、実行環境がなく、下記に自分で記述したシェルが動作するかわかりません。どなたか、実行が可能か教えてください。 ---------------------------------------------------------------- #!/bin/sh PKG_NAME=`rpm -qa | grep -e PAKAGEinst grep -e ABCnv` echo $PKG_NAME if [ $PKG_NAME = PAKAGEinst,ABCnv ] ; then echo "パッケージはすべてインストールされました!" else echo "パッケージが足りません!" fi ---------------------------------------------------------------- こんな感じで、記述したのですが、UNIX系OSに触れていないので、よくわからないです。どのたか、アドバイスをお願いします。

  • bashスクリプト

    bashスクリプト #!/bin/bash if [ -f *.log ]; then  echo `tar czf $(date +"%Y_%m_%d").tar.gz *.log` fi このようなスクリプトでecho ``(バックオート)でコマンドを実行できると思うんですが, tar czf $(date +"%Y_%m_%d").tar.gz *.log←これ自体を表示できないでしょうか? いまは,以下のようにしてコマンドを実行させ,さらに表示させています. これだとあまり賢くないというか,1行でスマートに表示させたいのですが, 可能でしょうか? if [ -f *.log ]; then  echo "tar czf $(date +"%Y_%m_%d").tar.gz *.log"  echo `tar czf $(date +"%Y_%m_%d").tar.gz *.log` fi