bash 添加额外的单引号

use*_*585 16 shell ssh quoting

我在执行脚本时遇到问题。
在调试模式 (bash -x) 下执行它时,我可以看到 bash 正在添加额外的引号。因此我的脚本失败了。

这是在我的脚本中:

testvar="\"sudo /home/pi/shared/blink.sh 27 off\""
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 ${testvar}
Run Code Online (Sandbox Code Playgroud)

这是输出:

ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 192.168.42.105 '"sudo' /home/pi/shared/blink.sh 27 'off"'
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 9

Bash 显示单引号以显示有效输入语法的命令。它没有运行在命令的参数中包含这些单引号的ssh命令。

ssh … '"sudo' /home/pi/shared/blink.sh 27 'off"'
Run Code Online (Sandbox Code Playgroud)

告诉你的SSH命令的最后4个参数是"sudo/home/pi/shared/blink.sh27off"

在远程主机上,ssh 守护进程使用空格作为分隔符连接命令的单词,因此您正在执行的远程命令是

"sudo /home/pi/shared/blink.sh 27 off"
Run Code Online (Sandbox Code Playgroud)

这会尝试执行一个名称为 的命令sudo /home/pi/shared/blink.sh 27 off,该命令当然不存在。

从定义中删除双引号testvar

这在这里无关紧要,但在您的实际情况中可能很重要:而不是${testvar}, write "$testvar"(或者"${testvar}"如果您愿意,但大括号是可选的)。除非您知道为什么需要将它们排除在外,否则始终在变量替换周围放置双引号"$testvar"扩展为变量的值testvar,而$testvar当不在双引号中时,将 的值testvar视为以空格分隔的 glob 模式列表。


cho*_*oba 3

Shell 将变量的值拆分为单词。双引号它以防止拆分。看到不同:

t='"a b c"'
set -xv
echo $t
echo "$t"
Run Code Online (Sandbox Code Playgroud)