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

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

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

  • 回答数3
  • 閲覧数214
  • ありがとう数15

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

  • ベストアンサー
  • 回答No.3
  • kmee
  • ベストアンサー率55% (1857/3366)

明らかにおかしいのはif文ですね。 Bsh系のif文は、続くコマンドの終了ステータスが正常終了(exit 0)だったらthen節、異常終了(0以外)だったらelse節を実行する、というものです。 計算式で分岐するものではありません。 例えば if echo 'Hello!' ; then echo OK. ;fi だったら、echo 'Hello!'は正常に終了→then節が実行されます。 コマンドを&&や||で継げると、前段のコマンドの終了ステータスによって後段のコマンドを実行するかどうかが決まります。そしてステータスは最後に実行したコマンドのものになります。 コマンド1 && コマンド2 だと、コマンド1が正常終了時に限りコマンド2が実行されます。その結果、全体で AND のような結果になります。 これでは、数値演算や比較に向かないので、 test というコマンドがよく使われます。 test コマンドは 引数を式として解釈し、その結果が真なら正常終了、偽なら異常終了ステータスを返す、というコマンドです。 また、if文を、他のプログラム言語のにように見せるために、 test コマンドは [ ] でも実行されるようになっています。 >if [ test -f "$trashname" && "$error" -le "10" ];then #10回エラーしたら終了 そこで、この文をよく見ると、 ・testコマンドの別名である [ の後に test があります。 ・testを削除すると、 [の終了である ] の前に && がきます。(testコマンドでの AND演算は &&ではありません) ・ && を生かすなら、後半は $error -lt 10 というコマンドとなり、コマンドが見付からない、とエラーとなるでしょう。 全体を[]で使うなら if [ -f "$trashname" -a "$error" -le "10" ];then testを使うなら if test -f "$trashname" -a "$error" -le "10" ;then &&を有効にするなら if test -f "$trashname" && test "$error" -le "10" ;then if [ -f "$trashname" ] && [ "$error" -le "10" ];then > if ($error -gt 10);then これは、 ($error -gt 10) を実行した結果による分岐、という意味になります。 ()でくくったコマンドは「サブシェル(別環境)でも実行」という意味になります。 なんかの数字にはなっているはずなので、たとえば error=11として 11 -gt 10 とコマンドラインに入力したのと同じことになります。おそらく、11というコマンドがみつからず、エラーになるでしょう。 異常終了なので elseが実行されます。 比較を行いたいなら、先程のように test コマンドです。 if test $error -gt 10 ;then if [ $error -gt 10 ];then 実際にどんなコマンドが実行されているかは shの-x や -v を使うとわかります。 sh -x プログラム名 ファイル名

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

関連するQ&A

  • シェルのif文について

    シェルの書き方で悩んでいます。 A,Bファイルにいずれかが読み取れない場合に、エラーにする if [ -r "A" -a -r "B" ] then else echo "エラー" fi 悩んでるところ→[ -r "A" -a -r "B" ]の否定は、どのようにかくのでしょうか? よろしく御願いします

  • UNIX

    UNIXの課題をやっていて、ここまで出来たのですが???の部分が 分かりません;誰か教えて頂けると助かります; 時間があれば説明も加えて頂けたら幸いです; #!/bin/bash #ふたつの引数の大小を判断し表示するシェルスクリプト if [ $# -lt 2 ] then echo "引数が足りません" exit fi cmp1=$1 cmp2=$2 if [ $cmp1 -gt $cmp2 ] then echo "$cmp1 ??? $cmp2" elif [ $cmp1 ??? $cmp2 ] then echo "$cmp1 = $cmp2" else echo "$cmp1 ??? $cmp2" fi

  • 【シェル】 count++ をしたい

    if [ $PIN6 == 0 ]; then P6="${SAN}"; else P6="${SHI}" ; `expr $count++` ; fi ; 上のようなシェルスクリプトを書きました。 count++ がうまく作用しません。 これで count=`expr $count +1` と同じ結果を出したいのですが、どうかご享受ください。 環境はLINUX Fedora10 bash です。

その他の回答 (2)

  • 回答No.2

$>chmod +x その.sh

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

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

「実行できない」とだけ言われてもねぇ.... 「どう実行できない」のかを明確にする, たとえば ・エラーメッセージが出るならそのエラーメッセージを書く, ・エラーメッセージは出ないんだけど期待した動作をしないということであれば「あなたが期待した動作」「実際の動作」を書く くらいできないものかねぇ.

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

関連する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 にあるのでしょうか?

  • 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

  • UNIXのシェル

    シェルに関して質問です。 0526とか0525のところは一日ごとにフォルダが作成されます。 unix\yasu\0526\hobby\test.txt unix\yasu\0526\hobby\test.txt unix\tomo\0525\hobby\test.txt unix\tomo\0525\hobby\test.txt ./check.sh MMDD 実行するときにMMDDのところに日付を入れてフォルダがあればコマンド1を実行するようにしたいです。 引数に指定した文字を判定するにはどうしたらいいのでしょうか? よろしくお願いします。 ----------------------------- #シェルの名前は「check.sh」です #! /bin/sh if [ $1 = "日付" ] ; then コマンド1 else コマンド2 fi -----------------------------

  • シェルの -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 というエラーが出てしまいます。 これについても、わかる人がいましたら教えてください。

  • 正規表現 Bシェル

    Bシェルの正規表現を教えてください。 ある文字列の中に英数大文字、小文字、コンマ、ピリオド、アンダーバー、ハイフン以外が含まれていないかをチェックしたいです。以下のようにすると文字列LINEの先頭にあるとチェックできるのに、中にあると出来ません。教えてください。 if expr \"$LINE\" : [^a-zA-Z0-9\\,\\.\\_\\-] >/dev/null ; then echo \"チェックNG 使用不可能な文字が入っています。 ${LINE}\" >> ${LOG_FILE} else echo \"チェックOK ${LINE}\" >> ${LOG_FILE} 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に触れていないので、よくわからないです。どのたか、アドバイスをお願いします。

  • シェルでファイルが2Gを超えているかの判定は?

    posix shでファイルが2Gを超えているかの判定を行いたいです。 size=`ls -l FILE | awk '{printf $5}'` if [ $size > 2147483648 ] then echo "2G超え" fi で、出来るかと思いましたがシェルではこのif文が行えません。 全然違う方法でいいのですが なんとかファイルサイズが2G超えか判定する方法は ありますでしょうか?

  • Bシェルのif文

    if文の否定について教えてください。 if $aa='xxx' then else echo yyy fi 間違っているかもしれませんが上に書いたことをやろうとしています。 他の言語の if(!($aa='xxx'))echo yyy; をBシェルのif文で書くにはどうしたらいいですか? $aa='xxx'を$aa!='xxx'にするのではなくて、その外側のifの書式を教えてください。 最初に書いたコードでは、if(!条件)を知らないので if(条件) else 処理 endif のように書きました。

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

  • UNIX teeコマンドについて

    あるテストプログラムの実行結果をteeコマンドで、ログに追加出力しようとしています 以下の1.変更前の様にシェルスクリプトを作成しました。 このシェルスクリプトを実行するとteeコマンドが正常終了するので $? が常に0になってしまい、必ずOKになってしまいます 急いでいたので2.のように修正したのですが、テンプファイルを使わないでもうちょっとシンプルに作成する方法をご存知の方教えてください 1.変更前 ./testpgm | tee -a logfile.txt  if [ $? -eq 0 ] ; then  echo "OK,testpgm," | tee -a logfile.txt else echo "NG,testpgm," | tee -a logfile.txt fi 2.変更後 ./testpgm > tempfile.txt if [ $? -eq 0 ] ; then cat tempfile.txt>>logfile.txt cat tempfile.txt echo "OK,testpgm," | tee -a logfile.txt else cat tempfile.txt>>logfile.txt cat tempfile.txt echo "NG,testpgm," | tee -a logfile.txt fi rm tempfile.txt OSはAIXで、シェルはshのみ使用可です