了解 bash 条件指令中的引号

了解 bash 条件指令中的引号

我的朋友正在摆弄 Bash 脚本,他想让我看一下它们(他让另一个朋友帮他做这件事)。其中一个命令是

if [ "`pidof transmmission-gtk`"=0 ];

pidof 之前的(反引号)到底有什么意义`,特别是当它本身用双引号引起来时?

作为参考,它用于分散分辨率包。我不太用 bash 所以这就是我问的原因。

答案1

反引号的意思是命令替换:展开的结果`pidof transmission-gtk`是运行命令的输出pidof transmission-gtk。另一种编写方式`pidof transmission-gtk`$(pidof transmission-gtk),并且建议使用这种替代方式(它没有缺点,并且可以避免当反引号内的命令本身包含引号时出现问题)。

周围的双引号可以防止命令替换的结果被分割成单独的单词并解释为通配符模式。如果您刚刚开始使用 shell 脚本,请不要担心这一点,只需记住始终在命令替换周围加上双引号即可。变量替换也是如此,例如总是 write "$foo",从不 plain $foo

编写的这段代码没有任何意义:测试包含一个单词,它类似于=0(如果没有正在运行的transmission-gtk进程)或1234=0(如果有匹配的进程)或123 456=0(shell 术语中的单个单词,甚至如果它碰巧包含空格)。测试中的单个单词始终被认为是正确的。要测试一个字符串是否等于另一个字符串,请编写[ "string1" = "string2" ](括号两侧和运算符两侧必须有一个空格)。要测试数值相等,请使用-eq运算符,例如[ 1 -eq 01 ]is true。

这里,有两种等效的方法来测试是否有正在运行的transmission-gtk进程:

  • 测试输出是否为空:

    if [ -z "$(pidof transmission-gtk)" ]; then …
    
  • 测试的返回状态是否为pidof非零,表示失败。由于命令的输出未被使用,因此将其重定向到/dev/null(大空洞)。

    if ! pidof transmission-gtk >/dev/null; then
    

答案2

bash(1)手册页,扩张部分,命令替换小节:

   Command substitution allows the output of a command to replace the com-
   mand name.  There are two forms:

          $(command)
   or
          `command`

   Bash performs the expansion by executing command and replacing the com-
   mand  substitution  with  the  standard output of the command, with any
   trailing newlines deleted.

引号是因为[它和 cinder 块一样聪明,并且不喜欢空字符串。

相关内容