引用數組中所有元素時${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
"$@" 已經不是簡單的字符串了