bash:隐式字符串评估

时间:2019-07-29 09:59:55

标签: string bash shell eval

在bash中,我可以将字符串评估为语句,例如

a="echo hello"
eval $a

我最近发现您还可以使用{p> 1展开a

$a

它似乎同样有效。

多行输入不起作用,但除此之外,$a通常是eval $a的合法替代品吗?

3 个答案:

答案 0 :(得分:2)

请参见man bash

  

扩展顺序为:大括号扩展;波浪号扩展,参数和变量          扩展,算术扩展和命令替换(以从左到右的方式完成);分词和路径名扩展。

在变量扩展之前发生的任何事情都不会用普通的$a扩展,而是会用eval "$a"执行(请注意双引号!)

示例:

$ a='echo {1..5}'
$ eval "$a"
1 2 3 4 5
$ $a
{1..5}

在解析命令时会检测到重定向和管道,因此也不会发生。

$ a='echo 1+1|bc'
$ eval "$a"
2
$ $a
1+1|bc

与变量分配,命令列表等相同

答案 1 :(得分:1)

不。首先,您想做unsigned char,否则您评估的结果可能会失控。但除此之外,int将不会进行任何扩展:

'\0'

您可以使用// Assuming 8-bit bytes int c = (unsigned char)some_char; // some code gets the value if (some_condition) c += 256; // handle something c &= 255; // back to previous value. 来分配变量:

eval "$a"

也许我没有想到更多。

答案 2 :(得分:1)

我认为eval "commands and parameters string"的真实等值将是"${commands_and_parameters_array[@]}"

a=(echo {1..5})
"${a[@]}"

正如@ DavidC.Rankin正确评论的那样:

  

记住,评估与邪恶之间只有1个元音。应该避免。

     

– David C. Rankin

至少,在某种程度上来说,数组的邪恶程度较小,因为它不会混合命令及其参数。