Bash

數組聲明:雙引號和括號

  • October 7, 2021

也許這是一個愚蠢的問題,但在Google上的兩個小時沒有出現任何問題。

簡而言之,Bash 中是否存在以下區別:

X="
a
b
c
"

X=(
a
b
c
)

前者符合變數的定義,後者符合數組的定義。

數組是一個多元素變數,所以這是說前者也是一個用於所有目的的數組嗎?

如果前者是一個數組,那麼(a)雙引號和(b)括號之間的唯一操作區別是對數組元素的引用規則的操作嗎?

非常感謝您的任何見解。

以換行符分隔的子字元串字元串與字元串數組不同。一個是字元串;另一個包含字元串。

通過在字元串中包含換行符將字元串分成幾行這一事實對字元串的儲存沒有特別的意義。shell 無法在行上對其進行索引,並且單行不能包含嵌入的換行符而不以某種方式對其進行編碼。

該數組是一組有序的單獨字元串。每個字元串都可以通過數組的索引立即訪問。單個數組元素可以包含任何標準字元串,帶或不帶換行符或其他定界字元(bashshell 中的 nul 字元除外)。但是,一個數組元素不能是另一個數組,因為bash不支持多維數組。

string1='Hello World'

string2="'Twas brillig, and the slithy toves
     Did gyre and gimble in the wabe:
All mimsy were the borogoves,
     And the mome raths outgrabe."

array=( "$string1" "$string2" )

printf '%s\n' "${array[1]}"

上面的腳本片段列印出 Lewis Carroll 的詩歌 Jabberwocky 的第一節。它不會列印Hello World,因為我們選擇輸出數組的第二個元素,而不是第一個。第二個元素是由字元組成的單個字元串。其中一些字元恰好是換行符和空格,但這僅用於展示目的。

要從第二個數組元素中的詩歌中僅輸出一行或任何其他子字元串,我們需要使用一些實用程序來解析字元串。從字元串中提取單個以換行符分隔的子字元串與 shell 中數組的概念沒有任何關係。

不,前者不是數組。

例如,您不能使用索引來選擇成員:

arr=(a b c)
echo "${arr[1]}"  # b

您可以使用數組來傳遞參數,但不能使用字元串。使用包含空格的元素以獲得更好的效果:

arr=(a 'b c' d)
printf '(%s)\n' "${arr[@]}"

string=$'\nm\nn o\np\n'
printf '(%s)\n' $string

輸出:

(a)
(b c)
(d)
(m)
(n)
(o)
(p)

man bash包含兩種變數類型的描述,無需Google搜尋。

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