if $( ssh user@host " [ -e file ] " ); 中的“if $”是什么意思?然后 ...?

if $( ssh user@host " [ -e file ] " ); 中的“if $”是什么意思?然后 ...?

我看到脚本中语句中的条件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

答案3

$(command)称为命令替换(请参阅 POSIX 规范这里和 bash 手册这里)。它是一种运行命令并将其输出传递给另一个命令的方法。它等效于 `command`但该$(...)语法是首选,因为它更容易嵌套命令并产生更具可读性的代码。

例如:

$ echo $(echo "bar")
bar

上面的命令将echo "bar"(即bar) 的输出传递给外部echo

相关内容