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
在执行前添加工作.但我不明白为什么.你能解释一下为什么一种方法有效而另一种方法不起作用?
你遇到的问题是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.
这应该做:
cmd=$(sed "s/b/\ /" exp)
Run Code Online (Sandbox Code Playgroud)
以变量方式存储数据var=$(commands)