在bash中,我可以将字符串评估为语句,例如
a="echo hello"
eval $a
我最近发现您还可以使用{p> 1展开a
$a
它似乎同样有效。
多行输入不起作用,但除此之外,$a
通常是eval $a
的合法替代品吗?
答案 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
至少,在某种程度上来说,数组的邪恶程度较小,因为它不会混合命令及其参数。