web-dev-qa-db-ja.com

「$」とは何ですか?シェルスクリプトで正確に教えてください。

私はコードがオンラインのどこかに書かれているのを見ました。お願いします。グーグルは助けにならなかった。

ここに私が見たコードがあります:

#!/bin/sh

ping -c 2 localhost
if [ $? != 0 ] ; then
    echo "Couldn't ping localhost, weird"
    fi

ping -c 2 veryweirdhostname.noend 
if [ $? != 0 ] ; then
    echo "Surprise, Couldn't ping a very weird hostname.."
    fi

echo "The pid of this process is $$"

から取得: http://efod.se/writings/linuxbook/html/Shell-scripts.html

26
Khushman Patel

$?は、最後に実行したコマンドの戻り値を保持する変数です。

Cプログラムの例(example.c):

int main() { return 1; }

Bashの例:

gcc -o example example.c
./example
echo $? # prints 1
36
Brendan Long

ほとんどの答えには、少し詳細がありません。決定的な答えは シェルのPOSIX標準、特別なパラメーターのセクション にあります:

$?最新のパイプラインの10進終了ステータスに展開します(パイプラインを参照)。

Wordpipelineに驚かないでください。lsなどの単純なコマンドでさえ、文法的には単一のコマンドで構成されるパイプラインであるためです。しかし、その後、マルチコマンドパイプラインの$?とは何ですか?これは、パイプライン内のlastコマンドの終了ステータスです。

grep foo bigfile|head -n 10 > result &のようなバックグラウンドで実行されるパイプラインはどうでしょうか?

パイプラインの最後のコマンドが終了すると、waitを介して終了ステータスを取得できます。バックグラウンドプロセスpidは$!として使用でき、$?はバックグラウンドコマンドが正しく開始されたかのみを報告します。

言及する価値があるもう1つの詳細は、終了ステータスが通常0から255の範囲であり、128から255がシグナルのために終了したプロセスであることを示します。 Cプログラムから他の値を返すと、$?に正確に反映されない可能性があります。

13
Jens

これは、最後に実行されたコマンドからの戻りコードです。

慣例により、0は正常終了であり、ゼロ以外は何らかのエラーを示します。

7
evil otto

この特殊変数は、スクリプトまたはコマンドラインで実行された最後のコマンドの終了ステータスを示します。たとえば、コマンドラインで、ユーザーは次のように入力できます。

 who; echo $?

出力は次のようになります

 user  tty7         2014-07-13 19:47
 0

これはwhoの出力とコマンドの終了ステータスを示しています。スクリプトも同じです。

 #!/bin/bash
 who
 echo $?

出力:0

1
user1744127

他の答えはbashをかなりうまくカバーしていますが、質問にシェルを指定していません。 csh(およびtcsh)で$?変数の存在を問い合わせる に使用できます。

if $?my_var then
    echo my_var exists
endif
0
craq