Bash

為什麼用readarray構造的數組元素用雙引號括起來時會得到一個虛構的n

  • April 5, 2017

我發現了一種readarray我無法深入了解自己的行為。

以下程式碼:

readarray array < <(echo -e "Jenny\nJane\nJessica")

echo "* Not enclosed:"
for ((i=0; i<${#array[@]}; i++)); do
   echo ${array[$i]}
done

echo "* Enclosed:"
for ((i=0; i<${#array[@]}; i++)); do
   echo "${array[$i]}"
done

產生以下輸出:

* Not enclosed:
Jenny
Jane
Jessica
* Enclosed:
Jenny

Jane

Jessica

為什麼當它們被這樣包圍時,元素會變得分開" "

即使我echo "${array[$i]}"用這樣的變數替換:

foo=${array[$i]}
echo "$foo"

輸出仍然間隔開。

但請注意,如果我以通常的方式聲明數組,array=("Jenny" "Jane "Jessica")則無論引號如何,都不會插入空格。

這導致問題的原因是因為我正在循環一個數組並且需要在一個句子中使用元素並回顯它。例如:

readarray array < <(echo -e "Jenny\nJane\nJessica")
for ((i=0; i<${#array[@]}; i++)); do
   echo "Hello, ${array[$i]}!"
done

但是${array[$i]}介於兩者之間," "因此\n被插入並且輸出變為:

Hello, Jenny
!
Hello, Jane
!
Hello, Jessica
!

這是因為 readarray 不會刪除分隔符(預設為換行符),除非使用-t選項呼叫它。

使用更簡單declare -p var的列印數組值,看看這個:

$ readarray array < <(echo -e "Jenny\nJane\nJessica")
$ declare -p array
declare -a array=([0]=$'Jenny\n' [1]=$'Jane\n' [2]=$'Jessica\n')

您可以看到每個元素的尾隨換行符。

雖然這樣:

$ readarray -t array < <(echo -e "Jenny\nJane\nJessica")
$ declare -p array
declare -a array=([0]="Jenny" [1]="Jane" [2]="Jessica")

沒有尾隨換行符。

使用不帶引號的變數擴展只是一個壞主意,只是不要。

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