如何将数组字面量直接传递给Bash函数
Bash 原生不支持你设想的 show_value (ga bu zo meu) 2 这种无引号包裹数组字面量的写法,括号在 Bash 中属于特殊元字符,直接放在参数位置会被识别为子shell起始标记,必然触发语法错误。
以下两种方案都可以实现不提前创建临时数组变量的需求,适配你使用的 Bash 4.4 版本:
方案1:修改函数参数逻辑,直接传递数组元素
把数组元素作为独立参数传递,最后一位放索引值,函数内部自行组装成数组使用,这种方法安全性最高,没有代码注入风险:
show_value() { # 取最后一个参数作为索引 local idx="${@: -1}" # 取除最后一位外的所有参数组装为数组 local myarray=("${@:1:$#-1}") echo "${myarray[$idx]}" } # 直接调用,无需提前定义数组变量 show_value ga bu zo meu 2
执行后会输出 zo,和你原有示例的运行结果完全一致。
方案2:保留类数组字面量写法
如果要贴近你设想的括号写法,只需要给数组字面量外层加单引号包裹,函数内部解析即可:
show_value() { # 解析传入的数组字面量字符串为数组 local -a myarray="$(eval echo "$1")" local idx="$2" echo "${myarray[$idx]}" } # 调用时仅需给数组字面量加一层单引号 show_value '(ga bu zo meu)' 2
注意:该方案用到了
eval,请确保你传入的数组内容完全可控,避免恶意代码注入风险。
内容的提问来源于stack exchange,提问作者greenoldman
相关产品推荐
相关产品推荐

