从shell脚本中的变量运行shell命令

Yos*_*sha 7 linux bash shell sed

我试图从shell脚本中的变量运行命令.正在使用的shell是bash shell.

该文件exp包含:

abcdef
Run Code Online (Sandbox Code Playgroud)

执行以下命令:

sed s/b/\ / exp
Run Code Online (Sandbox Code Playgroud)

...产生输出:

a  cdef
Run Code Online (Sandbox Code Playgroud)

但执行:

cmd="sed s/b/\ / exp"
echo $cmd
$cmd
Run Code Online (Sandbox Code Playgroud)

...产生以下错误:

sed s/b/\ / exp
sed: -e expression #1, char 5: unterminated `s' command
Run Code Online (Sandbox Code Playgroud)

我可以看到eval在执行前添加工作.但我不明白为什么.你能解释一下为什么一种方法有效而另一种方法不起作用?

fed*_*qui 6

你遇到的问题是Bash没有正确解释空间本身.

如果你b用另一个角色替换它,请看看它是如何工作的,比如说X:

$ cmd="sed s/b/X/ exp"
$ $cmd
aXcdef
Run Code Online (Sandbox Code Playgroud)

所以解决方法是使用十六进制作为空格,这是20:

$ cmd="sed s/b/\x20/ exp"
$ $cmd
a cdef
Run Code Online (Sandbox Code Playgroud)

或者用于eval执行命令本身:

$ cmd="sed s/b/\ / exp"
$ eval "$cmd"
a cdef
Run Code Online (Sandbox Code Playgroud)

正如Tom Fenech所建议的那样,将命令存储在变量中并不是一个好方法,正如我在尝试将命令放入变量中所述,但复杂的情况总是失败!.它有时可以工作,但在其他情况下会产生不可预测的结果.另一种方法是考虑使用函数.

最后,eval在这样的情况下,注释可以派上用场,只是对存储的内容非常小心.一些好的阅读:变量为命令; eval vs bash -c.


Jot*_*tne 0

这应该做:

cmd=$(sed "s/b/\ /" exp)
Run Code Online (Sandbox Code Playgroud)

以变​​量方式存储数据var=$(commands)

  • 如果你是发布问题的答案就意味着其他人不应该发布啊? (2认同)