【发布时间】:2015-02-16 13:48:27
【问题描述】:
我想执行一个需要 3 个参数的 shell 脚本。
参数号 2 包含一个带空格的字符串
我想将所有参数放在一个变量中,如下所示:
Linux:~# kk="\"111\" \"222 222\" \"333\""
Linux:~# echo $kk
"111" "222 222" "333"
现在如果我调用一个函数:
func() {
echo ---$1---
echo ---$2---
echo ---$3---
}
以这种方式使用 $kk 变量
func $kk
然后它会返回
Linux:~# func $kk
---"111"---
---"222---
---222"---
我期待得到这个结果
---111---
---222 222---
---333---
不使用eval如何解决这个问题?
我知道eval 解决了这个问题,但我不想使用它(因为如果我执行多次这样的调用需要时间)。
【问题讨论】:
-
如果没有
eval,您将无法做到这一点。详情请见mywiki.wooledge.org/BashFAQ/050。 -
如果目标是 bash 而不是 POSIX,可以用数组来完成(为什么用两个不同的 shell 标记?)
-
...即使在不支持正确数组的 ash 中,也可以使用函数的命令行参数作为临时安全数组存储来完成此操作(或完全覆盖全局
"$@",如果一个人不需要它,也不想使用函数来确定范围)。 -
顺便说一句,将多个参数放在一个标量变量中是不可能的(没有显式解析),原因很简单:标量变量可以存储 NUL 以外的任何值。一个参数同样可以存储除 NUL 之外的任何值。因此,没有办法判断
"111" "222 222" "333"是否意味着正好是一个包含文字引号的参数,四个包含文字引号但在空格上拆分的参数,或者三个不带引号的参数——但是对扩展施加解析规则将是老鼠的安全漏洞的巢穴,所以 Not Doing It 更安全,因此 shell 的行为也是如此。 -
“我想将所有参数放在一个像这样的变量中”......不,你没有。真的。你想要做的是重新设计其他地方所做的假设,让你认为你想要这样做......