Bash:如何评估这个字符串?

时间:2018-10-28 21:25:34

标签: string bash echo eval evaluation

如果我写

echo --optionA hello --optionB `seq 1 2 10` --optionC `printf "happy %.0s" {1..3}`

其评估为

--optionA hello --optionB 1 3 5 7 9 --optionC happy happy happy

这是所需的字符串,我最终可以使用

将其存储在新变量中
desiredString=$(echo --optionA hello --optionB `seq 1 2 10` --optionC `printf "happy %.0s" {1..3}`)

如果我要评估的字符串开头另存为字符串

string='--optionA hello --optionB `seq 1 2 10` --optionC `printf "happy %.0s" {1..3}`'

然后,如何获得所需的字符串?这是一些天真的尝试

$ echo $string
--optionA hello --optionB `seq 1 2 10` --optionC `printf "happy %.0s" {1..3}`

$ eval "$string"
-bash: eval: --: invalid option
eval: usage: eval [arg ...]

$ echo `echo $string`
--optionA hello --optionB `seq 1 2 10` --optionC `printf "happy %.0s" {1..3}`

我正在使用GNU bash版本3.2.57(1)-发行版(x86_64-apple-darwin15)

2 个答案:

答案 0 :(得分:2)

由于您的答案还可以,可以随时接受,让我们做得更好。

以下内容:

 string="-e string"
 eval "echo $string"

仅打印string,不打印-e,因为-e被解释为echo参数。

更糟糕的是,像string='; rm -rf /'这样的字符串将执行rm命令并擦除硬盘驱动器。更好的惯用方法是适当地转义printf

eval "printf '%s' \"$string\""

@edit

重新阅读您的问题后,我认为您正在搜索:

string="--optionA hello --optionB `seq 1 2 10` --optionC `printf "happy %.0s" {1..3}`"

或不推荐使用反引号`

string="--optionA hello --optionB $(seq 1 2 10) --optionC $(printf "happy %.0s" {1..3})"

在大多数情况下,使用var=$(echo ....)var="..."相同。

答案 1 :(得分:1)

发布问题后2分钟我就知道了...

$ eval "echo $string"
--optionA hello --optionB 1 3 5 7 9 --optionC happy happy happy