如果我写
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)-release (x86_64-apple-darwin15)
最佳答案
既然您的回答没问题并且可以接受,那么我们就来改进一下吧。
以下内容:
string="-e string"
eval "echo $string"
将仅打印string
,而没有-e
,因为-e
被解释为echo参数。
更糟糕的是,像 string='; 这样的字符串rm -rf/'
将执行 rm 命令并删除您的硬盘。更好且惯用的方法是正确转义 printf
:
eval "printf '%s' \"$string\""
@编辑
重新阅读您的问题后,我认为您只是在搜索:
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="..."
相同。
关于string - Bash:如何评估这个字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53036217/