Shell脚本中newarray=(;'echo "$@"')的分号含义及单引号必要性问询
Shell数组传递代码中的分号与单引号解析
先来看你提到的示例代码:
#!/bin/bash # array variable to function test function testit { local newarray newarray=(;'echo "$@"') echo "The new array value is: ${newarray[*]}" } myarray=(1 2 3 4 5) echo "The original array is ${myarray[*]}" testit ${myarray[*]}
运行结果确实能正确传递数组,但这句newarray=(;'echo "$@"')里的细节值得拆解,咱们一个个说:
1. 分号(;)的含义
说白了,;就是Shell里的命令分隔符——你可以用它在同一行里放多个独立的命令,Shell会依次执行。
在数组赋值的(...)括号里,Shell会把括号内的内容当成一个命令序列处理,把所有命令的输出按空白拆分后作为数组元素。你这句里的;把括号内分成了两部分:
- 前面是个空命令(
;前无任何内容),相当于执行了一个“啥也不干”的操作,不会产生任何输出; - 后面是被单引号包裹的
'echo "$@"'。
不过要提一句:这个分号完全是多余的!去掉它之后代码功能不受任何影响,甚至更简洁。原示例里加这个分号大概率是输入失误或排版小错误。
2. 单引号是否必需?
答案是:不仅不是必需的,反而会让代码无法实现预期功能!
单引号在Shell里是强引用,会把里面的所有内容当成普通字符串,不会解析变量、命令等。如果加了单引号,'echo "$@"'就只是一串普通字符,不会被当成命令执行,那newarray里存的就会是echo "$@"这串文本,而不是原数组的1、2、3这些值。
那为什么原示例能运行成功呢?大概率是把反引号(`)写成了单引号——反引号是Shell旧的命令替换语法,用来执行括号内的命令并捕获输出。如果是newarray=( `echo "$@"` ),echo "$@"会输出传递给函数的所有参数,这些输出会被组装成新数组,这才符合示例的运行结果。
另外补充:现在更推荐用$(command)这种命令替换写法,比反引号可读性更好,也不容易出错。比如这句的正确写法应该是:
newarray=( $(echo "$@") )
内容的提问来源于stack exchange,提问作者kala
相关产品推荐
相关产品推荐

