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

标签 linux bash shell sed

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

文件 exp 包含:

abcdef

执行以下命令:

sed s/b/\ / exp

...产生输出:

a  cdef

但是执行:

cmd="sed s/b/\ / exp"
echo $cmd
$cmd

...产生以下错误:

sed s/b/\ / exp
sed: -e expression #1, char 5: unterminated `s' command

我可以看到在执行前添加 eval 是有效的。但我不明白为什么。您能解释一下为什么一种方法有效而另一种无效吗?

最佳答案

您遇到的问题是空间本身没有被 Bash 正确解释。

如果将 b 替换为另一个字符,比如 X,看看效果如何:

$ cmd="sed s/b/X/ exp"
$ $cmd
aXcdef

因此解决方法是使用十六进制表示空格,即 20:

$ cmd="sed s/b/\x20/ exp"
$ $cmd
a cdef

或使用 eval执行命令本身:

$ cmd="sed s/b/\ / exp"
$ eval "$cmd"
a cdef

正如 Tom Fenech 所建议的那样,将命令存储在变量中并不是一个好的方法,如 I'm trying to put a command in a variable, but the complex cases always fail! 中所述。 .它有时可以工作,但在其他情况下会产生不可预测的结果。另一种方法是考虑使用函数。

最后,请注意 eval 在这种情况下会派上用场,只是要非常小心存储的内容。一些好的阅读:Variable as command; eval vs bash -c .

关于linux - 从 shell 脚本中的变量运行 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28580226/

相关文章:

linux - 无法从 shell 脚本终止进程

linux - 用 Awk 洗牌

linux - 如何将参数传递给 Bash 脚本?

linux - Shell:将参数中的...写入变量

linux - 对制表符分隔文件中的每一列执行不同的正则表达式

c++ - 如何找出依赖项中存在某个库的特定版本的原因?

linux - 目标是从显示信息中提取视频驱动程序版本,然后将其与支持的版本列表进行比较

bash - SSH while read line 循环而不使用远程命令

bash - Bash : graceful function death on error

linux - svn 提交不起作用