Bash

和有什麼區別一個ray_[]和d_一個rr一個是[∗]一個nd{array[]} and{大批@@@}?什麼時候使用一個比另一個?

  • February 7, 2022

使用以下程式碼:

#! /bin/bash                         
                                    
declare -a arr=("element1"           
               "element2" "element3"
               "element4" )         
echo "1"                             
echo "${arr[@]}"                     
                                    
echo "2"                             
echo ${arr[*]}                       

輸出是:

1
element1 element2 element3 element4
2
element1 element2 element3 element4

所以輸出是一樣的。

那麼什麼時候強制使用一種方法而不是另一種方法呢?

比較這三個循環的輸出:

#!/bin/bash

declare -a arr=("this is" "a test" "of bash")

echo "LOOP 1"
for x in ${arr[*]}; do
 echo "item: $x"
done
echo

echo "LOOP 2"
for x in "${arr[*]}"; do
 echo "item: $x"
done
echo

echo "LOOP 3"
for x in "${arr[@]}"; do
 echo "item: $x"
done

上面的腳本將產生這個輸出:

LOOP 1
item: this
item: is
item: a
item: test
item: of
item: bash

LOOP 2
item: this is a test of bash

LOOP 3
item: this is
item: a test
item: of bash

使用"${array[@]}" 雙引號將保留數組中的項目,即使它們包含空格,而使用"${array[*]}"或會失去該資訊${array[*]}


這在手冊頁的“數組”部分中進行了解釋bash(1),其中說:

可以使用 引用數組的任何元素${name[subscript]}。需要大括號以避免與路徑名擴展發生衝突。如果下標是@*,則單詞擴展為 name 的所有成員。只有當單詞出現在雙引號中時,這些下標才會有所不同。如果單詞是雙引號,則${name[*]}擴展為單個單詞,每個數組成員的值由 IFS 特殊變數的第一個字元分隔,並將${name[@]}name 的每個元素擴展為單獨的單詞…

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