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


 

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

 

Example:

 

  1. #!/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其實只引用了數組的第一個元素

  2. #!/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"

  3. #!/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'

  4. #!/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

     

     改進后的腳本執行情況驗證了我們的猜想

  5. 結論: $@ $* ${arr[@]} ${arr[*]} 類似,加不加"", 使用@還是*根據實際情況選擇
  6. 不加""的時候,@ 和 * 完全一樣,加""時,@可以保持原有參數結構,*將原有參數結構打亂
  7. shell對 "$@"會做特殊處理,"$*"可以認為是普通字符串
    #!/bin/sh for p in "$*";do
     echo $p done echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ for p in "$@";do
     echo $p done

     

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM