declare -a A
是否在 Bash 中創建一個空數組 A
?
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
,mksh
它yash
可以從外部範圍恢復變數。在
zsh
中,除了在sh
仿真中,typeset
如果變數尚未設置或已設置但來自不同類型(標量、數組和關聯數組),則使用變數聲明並將其設置為空值。