Bash

declare -a A 是否在 Bash 中創建一個空數組 A

  • May 28, 2019

declare -a A是在 bash 中創建一個空數組A,還是只是設置一個屬性以防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 的更高版本對此有所不同。我仍然想知道是否declare實際定義了一個變數(為空)。

這取決於之前是否已經在目前範圍(頂級也稱為全域或目前函式)中聲明了相應的變數。

如果尚未在目前作用域中聲明它(並註意在頂級作用域中,變數可能已通過從環境中導入它來聲明(並分配)),那麼它聲明它(使其成為函式的本地變數當在函式範圍內時),為其分配一個類型,但不初始化它,甚至不初始化為一個空列表(declare -p a顯示declare -a a,不像declare -a a=()你聲明和/或分配它時那樣a=())。

如果它已經在目前作用域中聲明(例如,因為它是在全域作用域中作為標量變數從環境中導入的),那麼declare -a a將嘗試其轉換為數組。

如果它以前是一個標量,那麼它就變成了一個([0]=value-of-the-variable)數組。如果它已經是一個數組,則保持不變。如果它是關聯數組,則會失敗並出現cannot convert associative to indexed array錯誤。

請注意,declare a這不會將數組或散列轉換為標量。bash無論如何都無法將雜湊/數組轉換為標量。您可以使用declare +aA a強制標量(如果變數以前是目前範圍內的散列/數組,則會因錯誤而失敗)。

在您的情況下,該變數可能尚未在目前範圍內聲明,因此它最終被聲明但未分配,這解釋了為什麼嘗試在set -u.

變數的兩個聲明分配/設置狀態之間的區別並不特定於bash. 在 POSIXsh中,您也可以export創建一個變數或readonly不給它一個值。

$ sh -uc 'unset -v var; readonly var; : "$var"'
sh: 1: var: parameter not set

請注意,unset取消設置和取消聲明變數。在bash,mkshyash可以從外部範圍恢復變數。

zsh中,除了在sh仿真中,typeset如果變數尚未設置或已設置但來自不同類型(標量、數組和關聯數組),則使用變數聲明並將其設置為空值。

引用自:https://unix.stackexchange.com/questions/521487