は-aAを宣言しますか
空の配列を作成するA
bashで、または A
の場合に属性を設定するだけですか 後で割り当てられますか?
このコードを検討してください:
set -u
declare -a A
echo ${#A[*]}
echo ${A[*]}
A=()
echo ${#A[*]}
echo ${A[*]}
A=(1 2)
echo ${#A[*]}
echo ${A[*]}
期待される出力はどうなりますか?
Bash 4.3.48(1)では、 bash:A:unbound variable
を取得します。 declare
の後に要素数を照会する場合 。
すべての要素にアクセスすると、このエラーも発生します。
Bashの新しいバージョンでは、これが異なる方法で処理されることを知っています。
それでも、宣言
> 実際に定義 変数(空にする)。
承認された回答:
これは、対応する変数が以前に現在のスコープ(トップレベル、別名グローバル関数または現在の関数)ですでに宣言されているかどうかによって異なります。
現在のスコープで宣言されていない場合(そして、最上位のスコープでは、変数が宣言されている可能性があることに注意してください。 (そして割り当てられて)それを環境からインポートすることによって)、それからそれを宣言し(関数スコープ内にあるときは関数に対してローカルにします)、タイプを割り当てますが、それを初期化しません、空のリスト(宣言-pa
はdeclare-a a
を示しています 、 declare -a a =()
ではありません a =()
で宣言および/または割り当てた場合と同じように 。
現在のスコープですでに宣言されている場合(たとえば、グローバルスコープで環境からスカラー変数としてインポートされたため)、 declare -a a
変換しようとします 配列に変換します。
以前はスカラーだった場合は、([0] =value-of-the-variable)
になります。 配列。すでに配列であった場合は、そのままにしておきます。連想配列の場合、連想配列をインデックス付き配列に変換できません
で失敗します エラー。
は
を宣言することに注意してください 配列またはハッシュをスカラーに変換しません。 bash
とにかくハッシュ/配列をスカラーに変換することはできません。 declare + aA a
を使用できます スカラーを強制します(変数が以前に現在のスコープのハッシュ/配列であった場合、エラーで失敗します)。
あなたの場合、変数はおそらく現在のスコープでまだ宣言されていないため、宣言されましたが割り当てられていません。これは、 set -u
で変数を展開しようとすると失敗する理由を説明しています。 。
2つの宣言の違い および割り当て済み /設定 変数の状態はbash
に固有ではありません 。 POSIXのsh
、 export
することもできます 変数にするか、読み取り専用
にします 値を与えずに。
$ sh -uc 'unset -v var; readonly var; : "$var"'
sh: 1: var: parameter not set
unset
に注意してください 変数の設定を解除し、宣言を解除します。 bash
で 、 mksh
およびyash
外部スコープから変数を復元する場合があります。
zsh
で 、 sh
を除く typeset
を使用したエミュレーション on変数は、まだ設定されていないか、設定されているが別のタイプ(スカラー、配列、連想配列)の場合は、宣言して空の値に設定します。