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