我的朋友正在处理 Bash 脚本,他想让我看看它们(他让另一个朋友帮他做)。命令之一是
if [ "`pidof transmmission-gtk`"=0 ];
Run Code Online (Sandbox Code Playgroud)
`
pidof 之前的(反引号)到底有什么意义,尤其是当它本身被双引号括起来时?
作为参考,它用于 disper 分辨率包。我真的不怎么使用 bash 所以这就是我问的原因。
反引号表示命令替换:扩展的结果`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 ]
为真。
这里,有两种等效的方式来测试是否有正在运行的transmission-gtk
进程:
测试输出是否为空:
if [ -z "$(pidof transmission-gtk)" ]; then …
Run Code Online (Sandbox Code Playgroud)测试 的返回状态是否pidof
为非零,表示失败。由于未使用命令的输出,因此将其重定向到/dev/null
(the great void)。
if ! pidof transmission-gtk >/dev/null; then
Run Code Online (Sandbox Code Playgroud)