• ベストアンサー

Unix shellscriptの初歩

shellScriptを手に入れて、中身を理解しようとしています。その中に (1) if [ $# -ne 1 ]; then echo "****" (2) XX=$1 とありました。 これの説明をお願いできますか?当方、今、勉強し始めたばかりです。よろしくお願い致します。 (2)は、多分、 本スクリプトの引数だとは思います。

noname#95859
noname#95859

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

シェルスクリプトを書いてtest.shという名前で保存したとします。 [name@localhost ~]$ sh test.sh hoge fuga とパラメータを付けて実行した場合に$#にパラメータの数(上の場合はhogeとfugaの2個あるので$#は2)、 $1には1番目のパラメータ(上の場合はhoge、$2はfuga以下同様)が入ります。

その他の回答 (3)

回答No.4

シェルスクリト(ファイル名 test.sh)というファイルを2つの引数 hiki1 hiki2 を渡して実行する場合は、コマンドが > sh test.sh hiki1 hiki2 となります。 $# というのは変数のことで引数の数をあらわします。今のコマンドの場合は引数を2個わたしたので、$#という変数に2という値が入ります。 $#が1ではないとき、****を表示させるというスクリプトなので引数を2個渡すと **** が表示されるわけです。

noname#95859
質問者

お礼

本当にありがとうございます。昨日本を買ってきました。 お恥ずかしい話・・・・今まで何がわからなかったかというと、 ShellScript と呼ぶことを知らなかったのです。 ShellScriptの初歩という本を買いました。書いてありました。 皆さんのご親切に感謝します。でも、本の中に掛かれていないものもあります。そういうものについて質問させていただきます。今後ともよろしくお願い致します。

回答No.2

$#についてですが、 【man sh】 から 次のパラメタは、シェルが自動的に設定します。 # 定位置パラメタ数 (10 進数 ) なので、呼び出し時の引数がなければ、0です。 上記のスクリプトの場合 もし、スクリプト呼び出し時の引数が1個以外なら、"***"を表示しなさい。 って感じです。

noname#198951
noname#198951
回答No.1

もし $# が 1じゃなければ(ノットイコール)、echoで"****"を画面表示 XXに$1の値を入れる という感じですかね?

noname#95859
質問者

補足

$#が何を言っているのかが、わかりません。 そこのところが知りたい。宜しくお願い致します。

関連するQ&A

  • 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

  • Linuxについて

    Linuxのスクリプトについて Linuxのスクリプトについての質問です #/bin/sh n=$1 while [ $n -le $2 ]; do echo "year $n" cal $n n=`expr $n + $3` done という引数に応じてカレンダーを出力するスクリプトを作成しました。 このスクリプトは引数が2つの場合は、1年ごとのカレンダーが表示されます。 ここに、引数が2つより少ないときはエラーメッセージを出力してプログラムを終了する機能をつけたいのですが 方法がよくわかりません。 #!/bin/bash # 実行時に指定された引数の数、つまり変数 $# の値が 3 でなければエラー終了。 if [ $# -ne 3 ]; then echo "指定された引数は$#個です。" 1>&2 echo "実行するには3個の引数が必要です。" 1>&2 exit 1 fi # ヒアドキュメントでメッセージを表示する。 cat <<__EOT__ 指定された引数は、 $1 $2 $3 の$#個です。 __EOT__ exit 0 このスクリプトをなんとか応用すればできると思うのですが なにせ初心者なもので;; ちょっと複雑になるとすぐに頭が混乱してしまう所存です・・・ どなたかご親切な方のご回答をお待ちしています。

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

    シェルスクリプトで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

  • UNIXでテキスト→PS→印刷なコマンド

    UNIXを勉強中です。 テキストファイルをPSファイルにして、すぐに印刷してくれるようなUNIXスクリプトを書いたつもりなのですが、どうもうまく行きません。 どこが間違っているのでしょう。 ちなみにプリンタはlp4160です。 #!/bin/csh -f if($#argv != 1)then echo "テキストファイルをPSファイルにして印刷します。" echo "ファイル名を指定します。" exit 1 endif a2ps -f9.8 $1 | lpr -Plp4160

  • Linux制御文

    Linuxを使い始めて、3ヶ月目のど素人です if [ $1 = 1 ];then echo A,a1,OK echo A,a2,OK echo B,b1,OK echo B,b2OK elif [ $1 = 2 ];then A,a1,OK A,a2,NG B,b1,OK B,b2,NG elif [ $1 = 3 ];then A,a1,NG A,a2,NG B,b1,NG B,b2,NG fi スクリプトの中身(質問部分) cat ($1か$2か$3) | soet | cut -d ,-f1 | uniq -c    ↑ここにファイルを入れたい スクリプトに引数$1か$2を渡した時 新しくファイル出力して、そのファイルが、cat の場所に入れたい 解りにくくて申し訳ないですが、困ってます!どうか宜しくお願いします

  • linuxのシェルスクリプト

    linuxのシェルスクリプト シェルスクリプトの質問をどこですればよいのかよくわからないので、ここでさせていただきます。 最近、始めてシェルスクリプトの勉強を始めました。 スクリプトに渡す引数を出力したいと思い、 echo $1 echo $2 echo $3 とかくと、スクリプトに渡した引数が出力されます。 これを、for文で書くと for i in 1 2 3 do echo $i done とねるのですが、これでは1,2,3が出力されてしまいます。 どうなおしたらいいのでしょうか? よろしくお願いいたします。

  • kshでのNULLの比較

    以下のスクリプトを作成し、変数に格納された値がNULLか調べたいと思っていますが、エラーが出力されてしまいます。 ■スクリプトの中身 #!/usr/bin/ksh HOGE="" if [ ${HOGE} != "" ]; then echo "${HOGE}" fi if [ -n ${HOGE} ]; then echo "${HOGE}" fi ■エラー + HOGE= + [ != ] hoge[5]: test: 0403-004 このコマンドにはパラメーターを指定してください。 + [ -n ] hoge[8]: test: 0403-004 このコマンドにはパラメーターを指定してください。 変数の中身がnullの場合、どのような比較条件を記述すればよいのでしょうか?

  • UNIX ファイル存在チェックの方法

    お世話になります。 UNIXにてファイル存在チェックを行うShellスクリプトを作成しています。 ■プログラム if (-f "text_file_*.txt") then echo "存在している" else echo "存在していない" endif ■問題点 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 +-*/が入った時にエラーを出したいのですが+-*/をどう判定したらよいのか教えて頂けます様お願い致します。

  • 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のみ使用可です