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
"$@" 已经不是简单的字符串了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律