详解shell数组${arr[*]}和${arr[@]}区别

 更新时间:2023年05月09日 14:50:25   作者:ascertain  
本文主要介绍了详解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[@]}内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • linux 文件管理命令之dirname \ find \ finds \ in \ indir详解

    linux 文件管理命令之dirname \ find \ finds \ in \ indir详解

    这篇文章主要介绍了linux文件管理命令之dirname\find\finds\in\indir详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Shell脚本一次读取文件中一行的2种写法

    Shell脚本一次读取文件中一行的2种写法

    这篇文章主要介绍了Shell脚本一次读取文件中一行的2种写法,本文还同时讲解了Shell读取文本文件的2种方法,需要的朋友可以参考下
    2015-04-04
  • Shell 字符串拼接的实现示例

    Shell 字符串拼接的实现示例

    这篇文章主要介绍了Shell 字符串拼接的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 详解gitBash中使用Linux中的tree命令

    详解gitBash中使用Linux中的tree命令

    最近很多同学问小编关于Linux命令的问题,小编今天主要介绍Linux里的tree命令,tree命令是一种递归目录列表显示命令,使用该命令可以以树状图的形式列出一个目录下所有文件内容,本文给大家介绍gitBash中使用Linux中的tree命令,一起看看吧
    2023-11-11
  • Linux查看端口占用情况的常用命令

    Linux查看端口占用情况的常用命令

    这篇文章主要给大家介绍了Linux查看端口占用情况的常用命令,lsof命令,netstat命令,ss命令,fuser命令,ps命令以及proc文件系统这几种常用命令,感兴趣的小伙伴跟着小编一起来看看吧
    2023-11-11
  • Shell执行/调用Java/Jar程序例子的实例详解

    Shell执行/调用Java/Jar程序例子的实例详解

    这篇文章主要介绍了Shell执行/调用Java/Jar程序例子的实例详解的相关资料,这里提供实例帮助大家实现这样的功能,需要的朋友可以参考下
    2017-08-08
  • 建立基于虚拟用户的VSftpd服务

    建立基于虚拟用户的VSftpd服务

    这篇文章主要介绍了建立基于虚拟用户的VSftpd服务的相关资料,需要的朋友可以参考下
    2015-09-09
  • shell脚本编程之循环语句

    shell脚本编程之循环语句

    这篇文章主要介绍了shell脚本编程之循环语句的相关资料,需要的朋友可以参考下
    2016-01-01
  • shell脚本之sed详细用法详解

    shell脚本之sed详细用法详解

    Sed是一个非交互性文本流编辑器,它编辑文件或标准输入导出的文本拷贝,vi中的正则表达式命令在sed中大多可以通用,下面这篇文章主要给大家介绍了关于shell脚本之sed详细用法的相关资料,需要的朋友可以参考下
    2022-07-07
  • Shell程序退出状态码的命令详解

    Shell程序退出状态码的命令详解

    在本篇文章当中主要给大家介绍一个shell的小知识——状态码。这是当我们的程序退出的时候,子进程会将自己程序的退出码传递给父进程,有时候我们可以利用这一操作做一些进程退出之后的事情,比如当程序执行失败或者被某个信号杀死我们就可以了解到,然后做出对应的措施
    2022-10-10

最新评论