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
    复制代码

     

     "$@" 已经不是简单的字符串了

posted @   ascertain  阅读(3715)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示