我看到脚本中语句中的条件if
使用了 a $
,我不明白为什么?
if $( ssh user@host " test -e file " ); then
echo "File is there"
else
echo "We don't that file on that host"
fi
答案1
$(...)
是命令替换。 shell 运行所包含的命令,并且表达式将替换为命令的标准输出。
通常,如果替换文本没有命名 shell 随后可以运行的命令,则会产生错误。但是,test
不会产生任何输出,因此结果是 shell“跳过”的空字符串。例如,考虑一下如果你运行会发生什么
if $( ssh user@host " echo foo " ); then
echo "File is there"
else
echo "We don't that file on that host"
fi
给定的代码编写正确,没有不必要的命令替换;该语句唯一if
需要的是命令的退出状态。
if ssh user@host "test -e file"; then
echo "File is there"
else
echo "We don't that file on that host"
fi
答案2
该$( ... )
构造执行命令并以字符串形式返回命令的退出状态及其输出。这是反引号的更现代版本`...`
。
它可以这样使用:my_id=$(id)
不过,您发布的代码片段是损坏的代码。它使用 的结果ssh user@host "test -f file"
,该结果似乎根据远程主机上文件的存在返回一个布尔值。不幸的是,它没有考虑到ssh
本身可能会失败:
if $(ssh -q localhost true); then echo YES; else echo NO; fi
YES
if $(ssh -q localhost false); then echo YES; else echo NO; fi
NO
if $(ssh -q nowhere true); then echo YES; else echo NO; fi
ssh: Could not resolve hostname nowhere: Name or service not known
NO
也许这是有意的行为,但我怀疑不是。
此外,$( ... )
是多余的,条件可以更好地直接表达:
if ssh -q user@host "test -e file"; then
echo "File is there"
else
echo "We don't [see] that file on that host [or the ssh failed]"
fi