2

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

如果我只是 echo $command 输出很好,如果我执行它会创建奇怪的输出

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

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

我也尝试直接执行它:

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

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

编辑:

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

command=rdesktop -u '' $server

并回显它,输出很好但是,如果我执行它

$command

它失败...

4

3 回答 3

2

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

command=( rdesktop -u '' $server )

并像这样执行它

"${command[@]}"

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

于 2012-05-24T10:01:19.117 回答
0

首先,如果你输入

`rdesktop something`

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

rdesktop something

现在报价。如果你执行

rdesktop -u '' $server

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

rdesktop -u "''" $server

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

编辑:当你想要对变量中的命令做的就是执行它时,请注意,这种引号的剥离只发生一次:

cmd="rdesktop -u '' $server"
$cmd
于 2012-05-24T06:30:10.627 回答
0

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

eval $command

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

于 2012-05-24T09:38:26.060 回答