位置パラメータが開始されることを読みました$1
(たとえば$1
、$2
などは$3
位置パラメータです)。ただし、$0
位置パラメータではありません。
しかし、なぜ$0
位置パラメータではないのですか?
これが理由かもしれませんが、わかりません。
位置パラメータは、スクリプトが実行されたときにのみその値を持ちます。たとえば./myScript Hello
、これは$1
価値があるでしょうHello
。ただし$0
、その値は、スクリプトの実行時(スクリプト名の値を持つ)と、bash
スクリプトなしでそれ自体が実行されるとき(bash
または値を持つこと-bash
)の2つの場合に得られます。
ベストアンサー1
@ikkachuはすでに説明しました私よりも優れています。ただ歴史のメモを追加しています。
Unixの最初のバージョンに付属のシェル(後でThompsonシェルと呼ばれる)には変数はありませんでしたが、すでにパラメータを使用して単純なスクリプトを作成できました。
sh [ name [ arg1 ... [ arg9 ] ] ] The name is the name of a file which will be read and in‐ terpreted. If not given, this subinstance of the shell will continue to read the standard input file. In command lines in the file (not in command input), character sequences of the form "$n", where n is a digit 0, ..., 9, are replaced by the nth argument to the invo‐ cation of the shell (argn). "$0" is replaced by name.
$1
...$n
は(最初の引数ではありません)すでに$0
スクリプトの引数と名前ですが、呼び出されません。位置パラメータそれから。
その時点で、$1
シェルで解釈される前に実際に最初の引数に置き換えられました。
たとえば、スクリプトには次のものが含まれます。
echo $1
~と呼ばれる
sh script 'foo; echo bar'
実行できますecho foo; echo bar
。このシェルは、数百KBのメモリを持つコンピュータ用に書かれた非常にシンプルなシェルです。
約10年後(1970年代後半)、BourneシェルはUnixバージョンで登場し、環境やその他の利点を導入しました。
Bourneシェルには、変数とより多くのプログラミング構成が付属しています。
これ位置パラメータ少なくともUnixシェルの場合、この用語はBourneシェルで導入されており、スクリプトで使用されている引数($1
まだスクリプト名)と同じことを示します。 Thompsonシェルと同様に、位置引数を使用して最初の9つの引数(to)のみを参照できます(ただし、残りの部分にアクセスするにはShiftまたはループを使用してください)(これはまた、ほとんどの最新実装でNotが必要な理由を説明します。 (逆方向移植性)。$n
$0
$1
$9
"$@"
for i do
${10}
$10
sh
今回はsh script 'foo; echo bar'
もうecho bar
実行されませんが、Bourneシェルはまだ悪名高いスプリット+globを導入します。これはThompsonシェルとの下位互換性を大幅に損なうことはなく、ファイルリストとしてまだ呼び出すことができますscript 'foo *'
。現在のディレクトリから引数として取得します(Thompsonシェルと同じですが、今回は別のメカニズムを使用します)。script
echo $1
echo
foo
スクリプトとも呼ばれるシェル(Bourneシェルにはまだ機能がありません):
2.0 Shell procedures The shell may be used to read and execute commands contained in a file. For example, sh file [ args ] calls the shell to read commands from file. Such a file is called a command procedure or shell procedure. Arguments may be supplied with the call and are referred to in file using the positional parameters $1, $2...
機能は1980年代初頭にKornシェル(Bourneシェルベース)に最初に導入されました。
function foo {
...
}
通事論。
後で、SysVR2(1984)では、別の構文を使用してBourneシェルに関数も追加されました。
foo() any-command
(ただし、単純なコマンドであり、リダイレクトがある場合、予期しない動作が発生します。これが、おそらくPOSIXが最も一般的に使用されるコマンドなどの複合コマンドのみを認識するようにPOSIXが要求する理由ですany-command
。){ ...; }
sh
KornおよびBourneシェルでは、関数$0
はまだ関数名ではなくスクリプト名です(一方、$1
位置$2
パラメータは関数パラメータを参照します)。
ksh93
これは、関数内で関数名となる関数定義スタイルを変更します。function f {
$0
ksh93のように、関数名はどこにzsh
ありますか?匿名機能も導入されました:$0
zsh
function { echo $1, $2; } foo bar
または
(){ echo $1, $2; } foo bar
ここでは、構文は$0
/ emulationにあるときにスクリプト名を保持します(anon)
。set +o functionargzero
sh
ksh
のzsh
ように、csh
スクリプトの引数は配列にあるため、引数の命名に似$argv
たプログラム名は複雑になりません。
ここでは、次を使用して位置パラメータに値を割り当てることができます。
argv[1]=value
または
1=value
(0=newprogramname
プログラム名を変更することもできます)。
Bourneなどの他のシェルでは、すべてを一度に割り当てる必要がありますset
。
set -- arg1 arg2
そして、あなたはそれを変更することはできません$0
。
rc
(少なくともパブリックドメインレプリケーションでは)次のことはできません。
1 = value
しかし、次のようにすることができます。
* = (arg1 arg2)
位置パラメータを設定します。$0
では変更できませんが、like inを使用して派生を変更rc
できます。es
0=newprogramname
zsh
長い話を短く
, $1
... $2
Thompson シェルから出るが呼び出されないスクリプト引数を表します。位置パラメータしかし。そして$0
(おそらく@ikkachuが言ったことに関してargv[0]
)スクリプト名を表します。
これ位置パラメータこの用語はBourne Shellに由来しています。
$0
スクリプトのパラメータを参照していないため、位置パラメータではありません。これはスクリプトの名前を表します(argv[0]
シェルがスクリプトを実行していない場合はシェルの名前を表します。一部のシェルでは、関数内で使用した場合の関数の名前を表します)。