Bash為什麼用
為什麼用readarray
構造的數組元素用雙引號括起來時會得到一個虛構的n
?
我發現了一種
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")
沒有尾隨換行符。
使用不帶引號的變數擴展只是一個壞主意,只是不要。