Bashのマニュアルは次のように言います:
パラメータは値を格納するエンティティです。
変数は名前で表されるパラメータです。
パラメータに値が割り当てられている場合は、パラメータが設定されます。
下付き文字が割り当てられている場合、配列変数は設定されたと見なされます。
配列変数は変数ですか、それともパラメータですか?
それでは、割り当て時に配列変数が設定されていると見なされないのはなぜですか()
?
$ ar=()
$ echo ${ar-This is a new value}
This is a new value
ありがとうございます。
ベストアンサー1
Inはbash
inと同じですksh
。ここで$var
は配列$var
であり、実際にはの略語です${var[0]}
。
だから:
var=([1]=whatever [2]=blah)
${var+set}
に拡張されずset
、インデックス0を持つ要素がない[[ -v var ]]
ため、falseを返します。 )。$var
bash
ksh
bash
(少なくとも4.3以降)では、次のように変数を配列として宣言するとき:
typeset -a var
var
最初は設定されていません。空のリストに設定されていませんでした。ではエラー4.3
がtypeset -p var
返されます。バージョン4.2以下では、以下を出力します。
declare -a a='()'
(配列を宣言すると空のリストが割り当てられるのと同じですzsh
。)
4.4では、出力は次のようになります。
declare -a var
したがって、4.3以降に設定されていない(しかし宣言された)配列は、空のリストが割り当てられた配列と同じではありません。
しかし、プログラム的に2つの違いを区別することは困難です。しかし、実際には、これらの区別はあまり役に立ちません。おそらく、配列にいくつの要素があるかどうかを知りたいでしょう。
((${#array[@]})) || echo array has no element
より良い配列設計を備えたシェルについては、およびzsh
をrc
参照fish
してください。yash