MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
シェルスクリプトの基礎 - 終了ステータスのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
シェルスクリプトの基礎 - 終了ステータス
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == コマンド終了時には、終了ステータスと呼ばれるコマンドの成否を表す数値が特殊変数<code>$?</code>に自動で設定される。<br> 各コマンドにより異なるが、コマンド成功時は0、失敗時は1(コマンドやエラーの種類によっては0以外)が設定される。<br> <br> 直前に実行したコマンドの成否は、以下のように、特殊変数$?に設定されている値で確認できる。<br> <コマンド> echo $? <br><br> == 終了ステータスの設定 == シェルスクリプトでは、exitコマンドに指定したパラメータ(0または1~255の正の整数)が終了ステータスとなる。<br> 正常に終了した時は<code>exit 0</code>、異常終了時は<code>exit 1</code>で終了することが慣例である。<br> <br> 関数も同様に、returnコマンドに指定したパラメータが終了ステータスとなる。<br> <syntaxhighlight lang="sh"> exit <数値> return <数値> </syntaxhighlight> <br> exitコマンドやreturnコマンドに終了ステータスを指定することで、任意の終了ステータスでシェルスクリプトおよび関数を終了することができる。<br> <br> exitコマンドは省略可能であるが、省略する場合は、シェルスクリプト内で最後に実行したコマンドの終了ステータスが、<br> シェルスクリプトの終了ステータスとなる。<br> また、returnコマンドも同様となる。<br> cat <存在しないファイル名> # catコマンドが失敗する場合、終了ステータスは1となる echo $? # 出力 1 <br> touch <新規ファイル名> # catコマンドが成功する場合、終了ステータスが0となる cat <新規ファイル名> echo $? # 出力 0 <br> 以下の例では、exitコマンドを使用して終了ステータスを設定している。<br> <syntaxhighlight lang="sh"> #!/bin/bash # カレントディレクトリにあるfooディレクトリの存在を確認 if [ -d ./foo ]; then echo "ディレクトリが存在する" exit 0 else echo "ディレクトリが存在しない" exit 1 fi # 出力 # ファイルが存在する場合 echo $? 0 # ディレクトリが存在しない場合 echo $? 1 </syntaxhighlight> <br><br> == 終了ステータスを判定してコマンドを実行する == ==== コマンドが成功した場合のみ次のコマンドを実行する ==== 以下のように、&&でコマンドを繋ぐ場合、直前のコマンドが成功した場合のみ、次のコマンドが実行される。<br> <br> コマンドが&&で結合される場合、シェルはcommand1の終了ステータスを判断して、0(成功)である場合のみcommand2を実行する。<br> さらに、複数のコマンドが結合される場合も、直前のコマンドが成功した場合のみ、次のコマンドが実行される。<br> command1 && command2 command1 && command2 && command3 <br> 直前のコマンドが失敗していると困る処理において、&&を使用する場合、直前のコマンドが成功していることが保証されるため、<br> 連続して2つのコマンドを実行するよりも確実性の高い処理になる。<br> ls hogehoge && echo "exists." <br> ==== コマンドが失敗した場合のみ次のコマンドを実行する ==== 以下のように、||でコマンドを繋ぐ場合、直前のコマンドが失敗した場合のみ、次のコマンドが実行される。<br> <br> コマンドが||で結合されると場合、シェルはcommand1の終了ステータスを判断して、0以外(失敗)であった場合のみcommand2を実行する。<br> さらに、複数のコマンドが結合される場合も、直前のコマンドが失敗した場合のみ、次のコマンドが実行される。<br> command1 || command2 command1 || command2 || command3 <br> command1が失敗した場合のみcommand2を試すといった処理を行う場合、この||を使用する。<br> ls fugafuga 2>/dev/null || echo "not exists." <br> ==== <code>rm -f</code>の終了ステータス ==== <code>rm -f</code>コマンド(強制削除)の終了ステータスは、<u>常に0となるため</u>、&&または||を使用してコマンドを連結しても期待する結果にはならない。<br> 例えば、ファイルを削除できなかった場合のみ、あるコマンドを実行するといった処理は、終了ステータスの判定ではできない。<br> # -fオプションを付加して実行する場合、ファイルが存在しなくともrmコマンドは成功する # ただし、rm -fを使用する場合でも、/tmp等のスティッキービットが設定されているディレクトリで、 # 他のユーザのファイルを削除しようとした場合には、終了ステータスが1となる。 rm -f foo echo $? 0 <br> このように、<code>rm -f</code>の終了ステータスは判断が難しいため、強制削除の終了ステータス判定処理は避けること。<br> <br><br> == 終了ステータスの応用 == ==== 入力値の判別(数値または文字列) ==== キーボードから入力する値が、数値または文字列かを判別する場合、exprコマンドとその終了ステータスを使用する。<br> <br> exprコマンド(四則演算などに使用するコマンド)は、以下のような終了ステータスである。<br> * 数値同士で演算を行った場合は、0 * 数値同士でも計算結果が0になる場合は、1 * 数値以外で演算を行った場合(計算できない場合)は、2以上 <br> つまり、数値とキーボードからの入力値をexprコマンドで演算を行い、<br> 終了ステータスが0または1ならば入力値は数値、2以上ならば入力値は数値以外の文字列と判断することができる。<br> <br> 以下の例では、exprコマンドと終了ステータスを使用して入力値の判定を行っている。<br> <syntaxhighlight lang="sh"> #!/bin/sh # キーボードから入力(-n を付けると改行なしで出力する) read -p "数字を入力してください > " KEY # 入力値に1を加算して、その終了ステータスを判定する expr 1 + $KEY >/dev/null 2>&1 case $? in 0 | 1) echo "[\$?=$?] 数字が入力されました > $KEY" ;; *) echo "[\$?=$?] 数字以外が入力されました > $KEY" ;; esac exit 0 </syntaxhighlight> <br> 上記のシェルスクリプトの実行結果は、以下の通りとなる。<br> 数字を入力してください >1 [$?=0] 数字が入力されました >1 #↑expr コマンドが成功するので、終了ステータスは「0」になる。 $ ./input_check.sh 数字を入力してください >-1 [$?=1] 数字が入力されました >-1 #↑expr コマンドは成功するが計算結果が0となるので、終了ステータスは「1」になる。 $ ./input_check.sh 数字を入力してください >hoge [$?=3] 数字以外が入力されました >hoge #↑計算できないため expr コマンドが失敗し、終了ステータスは「3」になる。 <br> ==== パイプ処理の終了ステータスの取得 ==== パイプ処理を行う場合、特殊変数$?に設定される値は、パイプ処理の最後に実行するコマンドの終了ステータスとなる。<br> <br> 以下のような例を考える。<br> exit 0 | exit 1 | exit 2 echo $? # 出力 2 <br> この時、最後のコマンドの終了ステータスではなく、パイプ処理の先頭または途中で実行するコマンドの終了ステータスを取得したい場合がある。<br> この場合、特殊変数$PIPESTATUS(配列)を参照することで、パイプ処理にて実行された各コマンドの終了ステータスを取得することができる。<br> <u>(ただし、bashのみ)</u><br> <br> 以下の例では、全要素(全終了ステータス)を参照しているが、個別に参照することもできる。<br> 詳細は、[[シェルスクリプトの基礎 - 配列]]を参照すること。<br> exit 0 | exit 1 | exit 2 echo ${PIPESTATUS[@]} # $PIPESTATUS配列において、@を指定して全要素を出力している # 出力 0 1 2 <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:シェルスクリプト]]
シェルスクリプトの基礎 - 終了ステータス
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse