詳解shell數組${arr[*]}和${arr[@]}區別

引用數組中所有元素時${arr[*]}和${arr[@]}是有細微區別的

Example:

#!/bin/sh
function showarr(){
        arr=$1
        for b in ${arr[*]};do
                echo $b
        done
        return 0
}
regions=('aa pp' 'bb' 'cc')
showarr $regions
exit 0

$regions其實隻引用瞭數組的第一個元素

#!/bin/sh
function showarr(){
        arr=$1
        for b in ${arr[*]};do
                echo $b
        done
        return 0
}
regions=('aa pp' 'bb' 'cc')
showarr ${regions[*]}
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
showarr ${regions[@]}
exit 0

引用瞭數組全部元素,但是showarr函數中arr變量隻獲取瞭第一個參數的值 "aa"

#!/bin/sh
function showarr(){
        arr=$1
        for b in ${arr[*]};do
                echo $b
        done
        return 0
}
regions=('aa pp' 'bb' 'cc')
showarr "${regions[*]}"
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
showarr "${regions[@]}"
exit

此種情況跟 $* $@比較類似,${regions[*]}把參數打散,作為一個字符串整體傳遞,原有參數結構被破壞

${regions[@]}保持瞭原參數結構,因此$1其實為 'aa pp'

#!/bin/sh
function showarr(){
        arr=$1
        for b in ${arr[*]};do
                echo $b
        done
        echo "\$1: $1"
        echo "\$2: $2"
        echo "\$3: $3"
        return 0
}
regions=('aa pp' 'bb' 'cc')
showarr "${regions[*]}"
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
showarr "${regions[@]}"
exit 0

改進後的腳本執行情況驗證瞭我們的猜想

結論: $@ $* ${arr[@]} ${arr[*]} 類似,加不加"", 使用@還是*根據實際情況選擇

不加""的時候,@ 和 * 完全一樣,加""時,@可以保持原有參數結構,*將原有參數結構打亂

shell對 "$@"會做特殊處理,"$*"可以認為是普通字符串

#!/bin/sh
for p in "$*";do
        echo $p
done
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for p in "$@";do
        echo $p
done

"$@" 已經不是簡單的字符串瞭

到此這篇關於詳解shell數組${arr[*]}和${arr[@]}區別的文章就介紹到這瞭,更多相關shell ${arr[*]}和${arr[@]}內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: