回答:
ここから:
$# Stores the number of command-line arguments that
were passed to the shell program.
$? Stores the exit value of the last command that was
executed.
$0 Stores the first word of the entered command (the
name of the shell program).
$* Stores all the arguments that were entered on the
command line ($1 $2 ...).
"$@" Stores all the arguments that were entered
on the command line, individually quoted ("$1" "$2" ...).
基本的に、$#
スクリプトの実行時に指定された多くの引数があります。$*
すべての引数を含む文字列です。たとえば$1
、最初の引数などです。これは、スクリプトの特定の引数にアクセスする場合に便利です。
ブライアンがコメントしたように、これは簡単な例です。次のコマンドを実行する場合:
./command -yes -no /home/username
$#
= 3$*
= -yes -no /home/username
$@
=配列: {"-yes", "-no", "/home/username"}
$0
= ./command
、$1
= -yes
など。これらはPOSIX標準の一部であり、すべての準拠シェルでサポートされる必要があります。参考のために、以下は各特殊パラメーターのPOSIX標準定義です。3つの追加の変数があります注意してください:$-
、$$
と$!
。
$@
:
1から始まる定位置パラメーターに展開します。二重引用符内で展開が発生し、フィールド分割(「フィールド分割」を参照)が実行される場合、各位置パラメーターは、最初のパラメーターの展開がまだ開始部分と結合されるという条件で、個別のフィールドとして展開します。元の単語(展開されたパラメータが単語内に埋め込まれていると仮定)、および最後のパラメータの展開は、元の単語の最後の部分と結合されます。位置パラメータがない場合、「@」が二重引用符で囲まれている場合でも、「@」の展開によってゼロフィールドが生成されます。
$*
:
1から始まる定位置パラメーターに展開します。拡張は、二重引用符で囲まれた文字列(参照内で発生すると二重引用符を)IFSが設定されていない場合、それは、またはでIFS変数の最初の文字で区切られた各パラメータの値を持つ単一のフィールドに展開するものとします。IFSがヌル文字列に設定されている場合、これは設定解除と同等ではありません。その最初の文字は存在しないため、パラメーター値は連結されます。
$#
:
位置パラメータの10進数に展開します。コマンド名(パラメーター0)は、位置パラメーターではなく特別なパラメーターであるため、「#」で指定された数にはカウントされません。
$?
:
最新のパイプライン(参照の小数終了ステータスに展開パイプラインを)。
$-
:
(ハイフン)呼び出し、set組み込みコマンド、またはシェルによって暗黙的に指定された現在のオプションフラグ(文字列に連結された1文字のオプション名)に展開します。
$$
:
呼び出されたシェルの10進数のプロセスIDに展開します。サブシェル(シェル実行環境を参照)では、「$」は現在のシェルと同じ値に展開されます。
$!
:
現在のシェルから実行された最新のバックグラウンドコマンド(リストを参照)の10進数のプロセスIDに展開します。(たとえば、サブシェルから実行されるバックグラウンドコマンドは、現在のシェル環境の「$!」の値に影響しません。)パイプラインの場合、プロセスIDはパイプラインの最後のコマンドのプロセスIDです。
$0
:
(ゼロ。)シェルまたはシェルスクリプトの名前に展開します。この名前の派生方法の詳細については、shを参照してください。
$*
および$#
1)環境変数ではなくシェル変数。2)標準化(POSIX仕様の一部)
"$@"
、${1+"$@"}
(移植性の理由で)として何度も記述されていることに注意してください。説明については、stackoverflow.com / questions / 743454 /…を参照してください。