$ 0が位置パラメータではないのはなぜですか?

$ 0が位置パラメータではないのはなぜですか?

位置パラメータが開始されることを読みました$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}$10sh

今回はsh script 'foo; echo bar'もうecho bar実行されませんが、Bourneシェルはまだ悪名高いスプリット+globを導入します。これはThompsonシェルとの下位互換性を大幅に損なうことはなく、ファイルリストとしてまだ呼び出すことができますscript 'foo *'。現在のディレクトリから引数として取得します(Thompsonシェルと同じですが、今回は別のメカニズムを使用します)。scriptecho $1echofoo

スクリプトとも呼ばれるシェル(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ありますか?匿名機能も導入されました:$0zsh

function { echo $1, $2; } foo bar

または

(){ echo $1, $2; } foo bar

ここでは、構文は$0/ emulationにあるときにスクリプト名を保持します(anon)set +o functionargzeroshksh

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できます。es0=newprogramnamezsh

長い話を短く

, $1... $2Thompson シェルから出るが呼び出されないスクリプト引数を表します。位置パラメータしかし。そして$0(おそらく@ikkachuが言ったことに関してargv[0])スクリプト名を表します。

これ位置パラメータこの用語はBourne Shellに由来しています。

$0スクリプトのパラメータを参照していないため、位置パラメータではありません。これはスクリプトの名前を表します(argv[0]シェルがスクリプトを実行していない場合はシェルの名前を表します。一部のシェルでは、関数内で使用した場合の関数の名前を表します)。

おすすめ記事