配列変数はいつ配列全体を表し、いつ「0」でインデックスされた要素を表しますか?

配列変数はいつ配列全体を表し、いつ「0」でインデックスされた要素を表しますか?

Bashのマニュアルは次のように言います:

下付き文字のない配列変数を参照することは、下付き文字がゼロの配列変数を参照するのと同じです。

0BashまたはPOSIXシェルでは、配列変数が配列全体を表す場合と?で索引付けされた要素を表す場合には、いくつかの一般的な規則があります。

例えば、

  1. declare配列変数は配列全体を表すように見えますが、パラメータ拡張ではindexの要素を表します0

    $ declare -p x
    declare -a x='([1]="b" [2]="c")'
    $ echo $x
    
  2. では配列を意味しますか、[[ -v myarr ]]それとも?myarrmyarr[0]

答え1

私はあなたの混乱が言葉にあると思います「引用する」

あなたはしません引用する配列変数は最終的にdeclare名前を付けたものですx

変数を参照するには、$名前の前に来る必要があります。

bashのマニュアルページですべてのインスタンスを検索しreferencて読んでください。


2番目の質問は次のとおりです。

では配列を意味しますか、[[ -v myarr ]]それとも?myarrmyarr[0]

テストに合格したということはmyarr[0]

$ declare -p myarr
bash: declare: myarr: not found
$ myarr=()
$ declare -p myarr
declare -a myarr='()'
$ echo $myarr

$ [[ -v myarr ]] && echo is set
$ [[ -v myarr[0] ]] && echo is set
$ [[ -v myarr[1] ]] && echo is set
$ myarr+=([1]=b)
$ declare -p myarr
declare -a myarr='([1]="b")'
$ echo $myarr

$ [[ -v myarr ]] && echo is set
$ [[ -v myarr[0] ]] && echo is set
$ [[ -v myarr[1] ]] && echo is set
is set
$ myarr+=([0]=q)
$ declare -p myarr
declare -a myarr='([0]="q" [1]="b")'
$ echo $myarr
q
$ [[ -v myarr ]] && echo is set
is set
$ [[ -v myarr[0] ]] && echo is set
is set
$ [[ -v myarr[1] ]] && echo is set
is set
$ 

答え2

変数を「変数名」を表す文字列と混合します。

Aは$variable変数であり、variableいくつかのコマンドによって変数として解釈される文字列です。

この試み:

$ a=x
$ x=(111 222 333)
$ declare -p $a
declare -a x='([0]="111" [1]="222" [2]="333")'

変数a()の拡張は$a文字列を提供し、xこれは「変数名」と解釈され、宣言された後に拡張されて印刷されます。

また、テストでは[[ -v myarr ]]文字列をmyarr変数として解釈するので、常に変数全体です。

努力する

$ a=myarr
$ unset myarr
$ [[ -v $a ]] && echo set || echo unset
unset

$ myarr[5]=five
$ [[ -v $a ]] && echo set || echo unset
set

関連情報