GNU/Linux >> Linux の 問題 >  >> Linux

`declare -a A`はBashで空の配列`a`を作成しますか?

は-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の新しいバージョンでは、これが異なる方法で処理されることを知っています。
それでも、宣言> 実際に定義 変数(空にする)。

承認された回答:

これは、対応する変数が以前に現在のスコープ(トップレベル、別名グローバル関数または現在の関数)ですでに宣言されているかどうかによって異なります。

現在のスコープで宣言されていない場合(そして、最上位のスコープでは、変数が宣言されている可能性があることに注意してください。 (そして割り当てられて)それを環境からインポートすることによって)、それからそれを宣言し(関数スコープ内にあるときは関数に対してローカルにします)、タイプを割り当てますが、それを初期化しません、空のリスト(宣言-padeclare-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 外部スコープから変数を復元する場合があります。

関連:ls -lですべてのファイルの時間や年が表示されないのはなぜですか?

zshで 、 shを除く typesetを使用したエミュレーション on変数は、まだ設定されていないか、設定されているが別のタイプ(スカラー、配列、連想配列)の場合は、宣言して空の値に設定します。


Linux
  1. 〜常に$ homeと等しいですか?

  2. Bash変数代入の単一括弧?

  3. bash の変数を持つエイリアス

  1. 「bash -c」は何をしますか?

  2. bash - 大文字と小文字を区別しない変数のマッチング

  3. bash ですべてのネットワーク インターフェイスを含むアレイを作成する

  1. Bashスクリプト(I)

  2. Bash動的(変数)変数名?

  3. Bashの文字列/配列から一意の要素の配列を作成するにはどうすればよいですか?