詳解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!
推薦閱讀:
- Shell內置命令之exit的語法與實例
- Shell腳本中$符號的幾種用法小結
- Shell退出狀態的使用
- Linux shell select菜單選擇實現代碼
- linux shell 編程之函數使用詳解