1. ホーム
  2. Linux

シェルスクリプトに$0, $? , $! , $$, $*, $#, $@ などのシェルスクリプトとlinuxコマンド実行時の戻り値の意味

2022-02-15 16:53:54
シェルスクリプトで$0, $? , $! , $$$, $*, $#, $@, などのシェルスクリプトとlinuxコマンドの戻り値の意味

(1)シェルスクリプトで$0, $? , $! , $$$, $*, $#, $@, など。

1.1. 簡単な説明

追記:Linux環境でもっと試せばわかると思います。
$$
シェル自体のPID(ProcessID、つまりスクリプトが実行されている現在のシェル)。 プロセスID 番号)
$!
シェルのバックグラウンドで最後に実行されたプロセスの PID (シェルのバックグラウンドで最後に実行されたプロセス) を示します。 プロセスID 番号)
$?
最後に実行したコマンドの終了コード(戻り値)、つまり直前に実行したコマンドの戻り値(最後のコマンドの終了ステータスを示す。0はエラーなし、それ以外はエラーを意味する)
$-
シェルが現在使用しているオプションを表示します、set コマンドと同じ機能です
$*
全パラメータのリスト。""" で囲まれた "$*" の場合と同様に、すべてのパラメータを "$1 $2 ... $n" の形式で出力します。このオプションには、9個以上のパラメータを指定することが可能です。
$@
全パラメータのリスト。""で囲まれた"$@"の場合と同様に、すべての引数を"$1" "$2" ... "$n" として出力してください。
$@ は $* と似ていますが、配列として使うことができます。
$#
シェルに追加するパラメータの数
$0
シェル本体のファイル名
1ドルから$n
シェルに追加される各パラメータの値です。1が第1パラメータ、2が第2パラメータ...。

1.2. スクリプトの例

簡単なスクリプトを書いて実行し、各変数の意味を説明しましょう。
# タッチ変数
# vi変数
スクリプトは次のように読みます。
#! /bin/sh
echo "番号:$#"
echo "scname:$0"。
echo "最初:$1"
echo "2番目:2"
echo "argume:$@"。
終了を保存
スクリプトの実行権限を与える
# chmod +x 変数
スクリプトを実行する
# . /変数 aa bb
番号:2
scname:. /variable
最初:aa
第二:bb
アーギュメント:aa bb

結果分析

結果を表示することで、次のことがわかります。
はスクリプトに渡されたパラメータの数です。
0はスクリプト自体の名前
$1 は、このシェルスクリプトに渡される最初の引数です。
2はシェルスクリプトに渡される2番目のパラメータです
はスクリプトに渡されたすべての引数のリストです

参考 https://blog.csdn.net/slovyz/article/details/47400107

(2) linuxコマンド実行時の戻り値に関する説明

Linuxでは、デスクトッププログラムを起動しても、コンソールでコマンドを実行しても、すべてのプログラムが最後に数値を返しますが、これを戻り値、またはエラー番号と呼びます。


2.1. コンソールの下に、前のプログラムの戻り値を保持する特殊な環境変数 $? があるので、試してみましょう。
$ ls *.png
Diagram1.png eqn.png peazip.png
eqn4.png マンデルブロー.png x2.png
$ echo $?
0
上記のようにいくつかのファイルに対してlsなどのランダムなコマンドを実行して開始し、print $? の値を表示します。
戻り値が0であることがわかりますが、これはどういう意味でしょうか?
戻り値が0である限り、プログラムが正常に実行されたことを意味します〜。
つまり、変数$? の値が0でない場合は、直前のコマンドがエラーで実行されたことを意味します。

2.2. 存在しないファイルをlsしてみることができる。
$ ls linuxgem
ls: linuxgem にアクセスできません。そのようなファイルまたはディレクトリはありません
$ echo $?
2
こうすることで、よくわからない英語のメッセージを大量に出力するようなコマンドでも、正常に実行が終了したかどうかを簡単に確認することができます。
ただし、エコーは疲れるので、プロンプトの中に$?

2.3. 最後のコマンド実行が成功したかどうかの返り値をプロンプトの中に入れてください: export PS1="[\$?

tom@localhost ~ $ export PS1="[\$?] ${PS1}"
[0]tom@localhost ~ $

export PS1="[\$?] ${PS1}" このコマンドは、プロンプトの先頭に$? の値を配置し、コマンド実行のたびに自動的に更新されるので、見やすいです〜。 

2.3. perrorでエラーヒントを見る

では、戻り値が0でない場合、どこにエラーがあるのかを知るにはどうすればよいのでしょうか。ほとんどのプログラムはエラーがあればヒントを出しますが、ヒントがない場合はperrorというプログラムを使ってエラーを見ることができます。例えば、戻り値が2であれば、実行することができます。
$ perror 2
OSのエラーコード2:そのようなファイルまたはディレクトリがない
これは、ファイルが存在しないことを明確にするものです〜。
2.4. エラーコードとその具体的な原因について、クロスリファレンスを示す。
"OS error code 1: Operation not permitted"
"OS error code 2: No such file or directory"
"OS error code 3: No such process"
"OS error code 4: Interrupted system call"
"OS error code 5: Input/output error"
"OS error code 6: No such device or address"
"OS error code 7: Argument list too long"
"OS error code 8: Exec format error"
"OS error code 9: Bad file descriptor"
"OS error code 10: No child processes"
"OS error code 11: Resource temporarily unavailable"
"OS error code 12: Cannot allocate memory"
"OS error code 13: Permission denied"
"OS error code 14: Bad address"
"OS error code 15: Block device required"
"OS error code 16: Device or resource busy"
"OS error code 17: File exists"
"OS error code 18: Invalid cross-device link"
"OS error code 19: No such device"
"OS error code 20: Not a directory"
"OS error code 21: Is a directory"
"OS error code 22: Invalid argument"
"OS error code 23: Too many open files in system"
"OS error code 24: Too many open files"
"OS error code 25: Inappropriate ioctl for device"
"OS error code 26: Text file busy"
"OS error code 27: File too large"
"OS error code 28: No space left on device"
"OS error code 29: Illegal seek"
"OS error code 30: Read-only file system"
"OS error code 31: Too many links"
"OS error code 32: Broken pipe"
"OS error code 33: Numerical argument out of domain"
"OS error code 34: Numerical result out of range"
"OS error code 35: Resource deadlock avoided"
"OS error code 36: File name too long"
"OS error code 37: No locks available"
"

参考 https://blog.csdn.net/u012359618/article/details/51442966