シェルスクリプトでの変数と関数の扱いについて

このQ&Aのポイント
  • シェルスクリプトで表記されるXXXnumは、通常の変数(環境変数ではない)として扱うことができます。
  • シェルスクリプトでは、C言語と同様に変数の宣言を行う必要はありません。
  • XXXchk:は関数の終了を示す記述であり、単に"end"と表記するだけで構いません。
回答を見る
  • ベストアンサー

cシェルについて(その1)

質問です。 以下のように表記されている場合 @ XXXnum=0 XXXchk: @ XXXnum++ if ($XXXnum > 3 ) then goto XXXerror とある場合、XXXnumはふつうの変数(環境変数等ではなく) と考えてOKなのでしょうか? (@マークについてよく解らないもので) またCの様に(関数の)頭で宣言しなくて宜しいのでしょうか? また、XXXchk:とは関数のくくりで終わる場合単に、 end の表記だけでよいのでしょうか? (XXXchk:が関数の頭だとするとこれの中にも一つ同じ様な表記があって  endが一個しかないのも疑問なんですが) cシェルと言うよりシェル全般に関して初心者なんで、宜しくお願いいたします。

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

  • ベストアンサー
  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

@ は整数型のシェル変数を設定することを示します。 単なる代入ならば set XXXnum=0 としても良いのですが、@ の場合は @ XXXnum++ @ XXXnum=2+3 のように式を記述することができます。 シェル変数は環境変数と異なり、そのシェルの内部だけで使われるもので、 他のプログラムに引き渡したりすることは、特別な工夫をしない限り できません。宣言は必要ありません。 XXXchk: は関数を示すものではなく、ラベルと呼ばれるもので、単なる 目印です。 goto XXXchk: のような記述があった場合はここへ飛んできますが、処理が終わった後 元の場所へ戻るというようなことはないので、endは不要です。

ami_mizuno
質問者

お礼

有り難うございます。 よく解りました。 シェルって結構簡単に変数を宣言できるものなんですね。 あと、XXXchk: は関数を示しているんじゃなかったんですね。 何かこういうくくりを見て思わず「関数なんかな?」と思ってしまったので。 まだまだ解らないことだらけなので、今後ともご教授の程宜しくお願いいたします。

関連するQ&A

  • Cシェルの制御文について(求むCシェル・マスター)

    Cシェルでとある処理をすることになり、参考資料としてスペシャリストな人の シェルをみせてもらったのですが、ソースを読むこともままなりません(><) 私自身はVisualStudioを使ってCのプログラミングをかなり前にちょろっとやった程度で、 シェルというものをほとんど組んだことがないので、以下の点を教えてください。 if [ほにゃらら] then コマンドをぽちっとな elif [はにゃらら] then コマンド2をぽちっとな else exit fi 上記のような制御文を参考資料の中で多数みるのですが、 "elif"と"fi"が、まったく何者かわかりません。 Cシェルやelifなどで、ぐぐってみましたが、わからず 誰か助けてぇ~って感じです。 また、シェルの勉強サイト(C,Tc,B,Bash)のサイトも ありましたら教えてください。すんませんが、よろしくお願いします。

  • Kシェルでgotoのような処理を作成したい。

    Kシェルでgotoのような処理を作成したい。 以下のような処理で、入力した文字が条件と一致しなかった場合、 再度、入力からやり直させるようにしたいです。 以下が例です。 NGになった場合、再入力を促したいです。 #!/bin/ksh echo "Input Moji ---> \c" read ans_Moji if [ ${ans_Moji == "入力した文字" ] ; then echo "OK" else echo "NG"  fi Windowsのようにgoto文があれば、簡単に出来るのですが、 シェルをはじめたばっかりでよく分かっておりません。 何かご存知でしたら、ご教授願います。

  • 変数とループを使ったマクロについて

    恐縮ですが、ご教示をお願い致します。 comboboxの値を空白のtextboxに貼り付けるものです。 本を片手にマクロを作成していたのですが、上手くいかず困っております。 作成したマクロ Private Sub CommandButton100_Click() '入力値のチェック If ComboBox1 = "" Or ComboBox2 = "" Then GoTo 998 '空白ボックスを検索しデータ入力 If TextBox11 = "" And TextBox12 = "" Then TextBox11 = ComboBox1 TextBox12 = ComboBox2 GoTo 999 End If If TextBox21 = "" And TextBox22 = "" Then TextBox21 = ComboBox1 TextBox22 = ComboBox2 GoTo 999 End If If TextBox31 = "" And TextBox32 = "" Then TextBox31 = ComboBox1 TextBox32 = ComboBox2 GoTo 999 End If ↓ ↓  以下50個あります。 ↓ If TextBox501 = "" And TextBox502 = "" Then TextBox501 = ComboBox1 TextBox502 = ComboBox2 GoTo 999 End If 998 MsgBox "入力値に誤りがあります 999 End Sub とてつもなく長くなってしまいました。 変数をループを使って色々やってみたのですが、どうにもならず。。。 簡単に変数及びループを使用して纏める事は出来る物なのでしょうか? よろしくお願いいたします。

  • Cシェルでの文字列大小比較

    Cシェルで set AA="aa" set BB="bb" if( $AA > $BB )then echo "$AA > $BB" endif というような判定がしたいのですが、 上記の場合、”if: 条件式構文が正しくありません”というエラーが出力されます。 Cシェルの場合、文字列の比較は ifでイコールかノットイコールかは判定できますが、文字コードの大小比較が出来ないようですが、 文字列の大小比較をするにはどうすればよいのしょうか

  • シェル作成手伝ってください><

    会社に入社して3年目。 シェル作成はまだド素人であり、期日がもうせまっており とても困っております。 よかったら助けてくれませんか??? 内容は下記を参照ください。 <シェル内容> ・coreファイル削除をシェルにて削除したい。 ・削除対象ディレクトリ←ここにファイルが作成されます。 →/home/xxxx/配下 できればfindにてcoreファイルを参照してファイルがあれば 削除し、なければそのまま何もせずに終了する。 ちなみにUNIXでcshで作成してほしいと言われました。 ついでといっては失礼と思いますが、続けてif文のココもわからないのでできたら教えてください。 if ( 変数 )then 変数がわからんです。 本当に唐突的ですがお早めの回答よろしくお願いいたします。

  • C言語 関数の戻り値と自動変数

    かなり基礎的な質問になるのですが、疑問に思うことがあり、質問をさせていただきます。 関数内で宣言した変数を戻り値として使う場合ですが、ポインタなどではなく実体の場合でも、静的変数として宣言をしたほうが良いのでしょうか? 現実的に考えると、プログラムが関数から出て、呼び出した側の関数が戻り値を受け取るまでの瞬間に、その領域が書き換えられる可能性は極めて低いと思うのですけど、C言語の仕様としてはどうなのでしょうか? 関数内で宣言した戻り値に使う変数には、必ずstaticをつけた方が良いのでしょうか? もしおわかりでしたら教えて下さい。

  • C#で、定数をフラグ(if文)によって切り替え

    C#ですが、カテゴリが無いのでC/C++のカテゴリに入れています。 基本的に変数(定数)の宣言は1回しか出来ないとわかっていますが、 以下の様な定義を何とかできないでしょうか? if (true) { public static readonly string Flag = "True"; } else { public static readonly string Flag = "False"; } これって、変数を使って、以下のようにするしか無いですよね…… public static string Flag = ""; if (true) { Flag = "True"; } else { Flag = "False"; } もしくは、変数で宣言した物を、途中で定数にする事は可能でしょうか? 目的としては、グローバルで宣言した変数を別の関数で変更されないようにしたいだけなのですが。 何か、手があれば教えてください。

  • exitコマンドの後の変数について(シェル)

    シェルをはじめたばかりの初心者です。 以下のようなシェルがあります。exit後のexit_cancelという変数は何に使われるのでしょうか? exitしてしまえばシェルは終了してしまうので exit_cancelという変数は関係ない気もするのですが・・・ ちなみにexit_cancelという変数はシェル内には どこにも定義していません。 どなたか教えて頂けないでしょうか? 何卒よろしくお願い致します。 case "${opt_exec}" in "z") ;;  *)     print -n "本当によろしいですか?[y/n] =>"     read REPLY   if [[ ${REPLY} != "y" ]] then echo "処理を中止します。" exit ${exit_cancel}        fi esac

  • メッセージを求められるシェルを連続実行

    お世話になります。 現在シェルを作成しています。 既に存在するシェル(100個)を順番に実行するシェルを 作成しようとしています。 しかし、その存在するシェルは実行すると、YES/NO  の確認メッセージに答えないと、進まないようになってい ます。 そのため、確認メッセージに中断されて連続で実行できません。 この確認メッセージで止まらずに連続実行する手段は あるのでしょうか? シェルに詳しい方のご教授ねがいます。 ■既に存在するシェルのメッセージ確認の個所 echo $変数 "実行しますか(確認メッセージ?) [N] => \c" read YN echo " " if [ "$YN" != 'Y' -a "$YN" != 'y' ];then echo ' 実行しません' exit 1 fi

  • 初めて投稿します。シェル、VBS共に知識が無く困っています。

    初めて投稿します。シェル、VBS共に知識が無く困っています。 UNIXからWindows2008の移行に伴い、シェルからVBSに変更しているのですがJP1の動作がうまくいかず困っています。 JP1のjr3bjsubコマンド自体はうまく動作しているのですが、ジョブが登録完了するまで待ってくれません・・・。 どうしたら良いかどなたかご存知であらば教えてください。 ・シェルの内容 #!/sbin/sh typeset -i CNT=1 if [ "$3" = "" ] then while [ $CNT -le 5 ] do /opt/jp1_am_r3/bin/jr3bjsub -jn $1 -pa $2 -rs -out LP01 -wait -time 900 RTN=$? if [ $RTN -le 2 ] then break fi CNT=$CNT+1 sleep 1 done else while [ $CNT -le 5 ] do /opt/jp1_am_r3/bin/jr3bjsub -jn $1 -pa $2 -var $3 -rs -out LP01 -wait -time 900 RTN=$? if [ $RTN -le 2 ] then break fi CNT=$CNT+1 sleep 1 done fi return $RTN ・動かそうとしているVBSの内容 '引数:実行先(-d)  '曖昧な宣言を禁止 Option Explicit 'ERRが発生しても後続処理を続ける On Error Resume Next '変数/オブジェクト宣言 Dim objWshShell ' WshShell オブジェクト Dim strCmdLine ' 実行するコマンド dim args dim rtn '定数宣言/オブジェクト作成 Set args = WScript.Arguments Set objWshShell = WScript.CreateObject("WScript.Shell") '------------メイン処理START If Err.Number = 0 Then If args.Count < 2 Then Err.Description = "引数が不足" WScript.Echo "エラー: " & Err.Description ElseIf args.Count = 2 Then strCmdLine = "C:\Program Files (x86)\Hitachi\JP1AMR3\Program\jr3bjsub.exe -rs -out LP01 -wait -time 900 -jn " & args.item(0) & " -pa " & args.item(1) ElseIf args.Count = 3 Then strCmdLine = "C:\Program Files (x86)\Hitachi\JP1AMR3\Program\jr3bjsub.exe -rs -out LP01 -wait -time 900 -jn " & args.item(0) & " -pa " & args.item(1) & " -var " & args.item(2) Else Err.Description = "引数が多すぎます" WScript.Echo "エラー: " & Err.Description End if objWshShell.Exec(strCmdLine) If Err.Number = 0 Then WScript.Echo strCmdLine & " を起動しました。" End If End If 'Set objWshShell = Nothing よろしくお願いします。