如果,否则基于通过管道传输到 grep 的命令

iLe*_*ing 10 linux parallels bash grep macos

我不知道如何使这个(应该是简单的)脚本工作。基本上我想要的是,根据我的 Parallels vm 的状态运行不同的东西,如下所示:

if [ prlctl list --info ubuntu-vm | grep State == "State: running" ] ; then 
   echo 'machine is running'
else
   echo 'machine is not running'
fi
Run Code Online (Sandbox Code Playgroud)

这当然行不通

dev*_*ull 17

问题是你把它全部放在里面[,即test命令。此外,你的使用grep被破坏了。

所有你需要的是:

if prlctl list --info ubuntu-vm | grep -q "State: running"; then
   echo 'machine is running'
else
   echo 'machine is not running'
fi
Run Code Online (Sandbox Code Playgroud)

请注意-q用作 的参数grep。如果找到匹配项,它不会向 STDOUT 写入任何内容并以状态 0 退出,否则以非零状态退出。


use*_*686 5

另一种检查,不太“干净”,但更接近问题试图实现的目标。

\n\n

请记住,[其核心只是一个命令。它始终接受特定数量的参数,并以 0(成功)或 1(失败)退出状态退出,就像所有其他命令一样。例如,当您比较两个字符串时,语法为[, string 1, ==, string 2, ]

\n\n

现在您正在使用它作为条件if

\n\n
[ prlctl list --info ubuntu-vm | grep State == "State: running" ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

但它在几个方面是模棱两可的。如何[知道左侧有要运行的命令而不是固定字符串?它如何知道 是==字符串比较运算符,而不仅仅是 的参数grep?它如何知道 is|是左侧值的一部分,而不是将命令分成 [ prlctl list --info ubuntu-vmgrep State == "State: running" ]

\n\n

所以左侧也需要引用。另外,由于您想要比较该命令的输出,而不是世界“prctl list --info ...”本身,因此您需要$(\xe2\x80\xa6)符:

\n\n
[ "$(prlctl list --info ubuntu-vm | grep State)" == "State: running" ]\n
Run Code Online (Sandbox Code Playgroud)\n