shell脚本:执行中的单引号

时间:2012-05-24 06:13:01

标签: shell escaping shellexecute

我在shell脚本中执行的命令中使用单引号时遇到问题。 在我的脚本中,我执行一个rdesktop命令,该命令应该有-u''(< - 2个单引号)作为参数。 但是,无论我如何试图逃避引号,它都没有正确传递。

如果我只是回显$命令输出正常,如果我执行它就会创建奇怪的输出

这是脚本中不起作用的部分:

command="rdesktop -u "\'\'" $server"
`$command`

我也试过直接执行它:

`rdesktop -u "\'\'" $server`

我很感激任何帮助,因为我阅读了很多关于在shell脚本中转​​义字符的教程而没有找到解决方案..

编辑:

有趣的是,如果我只是使用

command=rdesktop -u '' $server

并回复它,输出很好 但是,如果我用

执行它
$command

它失败了......

3 个答案:

答案 0 :(得分:2)

如果您的shell是bash或ksh或zsh,那么使用数组而不是字符串构建命令会更安全,更容易:

command=( rdesktop -u '' $server )

并像这样执行

"${command[@]}"

我无法想象远程服务器需要查看名为字面''的用户名(即2个单引号) - 它可能只需要一个空字符串。

答案 1 :(得分:0)

首先,如果您输入

`rdesktop something`

然后这意味着调用rdesktop,获取输出,并将该输出作为命令运行。要“直接执行”,只需输入

即可
rdesktop something

现在报价。如果你执行

rdesktop -u '' $server

然后rdesktop将看不到引号。它们作为解析命令的shell的一部分被删除。要让rdesktop看到参数'',请使用

rdesktop -u "''" $server

没有必要真正添加任何进一步的转义,因为单引号在双引号字符串中并不特殊。

编辑:如果要对变量中的命令执行操作只是为了执行它,请注意这个引号的删除只发生一次:

cmd="rdesktop -u '' $server"
$cmd

答案 2 :(得分:0)

当您调用rdesktop -u '' $server时,您正在调用带有3个参数的rdesktop,其中第二个是空字符串。我不清楚为什么你试图在反引号中调用它,但你可以使用你的第一个命令定义得到你想要的东西,并且:

eval $command

请注意,如果您未完全控制$server的内容,则存在很大的安全风险。 (例如,如果server是字符串; cmd,则调用eval将执行cmd