如果,否则基于传送到 grep 的命令

如果,否则基于传送到 grep 的命令

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

if [ prlctl list --info ubuntu-vm | grep State == "State: running" ] ; then 
   echo 'machine is running'
else
   echo 'machine is not running'
fi

当然,这是行不通的

答案1

问题在于,您将所有内容都放在[(即test命令)中。此外,您的 用法grep也不对。

所有你需要的是:

if prlctl list --info ubuntu-vm | grep -q "State: running"; then
   echo 'machine is running'
else
   echo 'machine is not running'
fi

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

答案2

另一种检查方法,虽然不那么“干净”,但却更接近问题所要达到的目的。

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

现在您正在使用此作为if条件:

[ prlctl list --info ubuntu-vm | grep State == "State: running" ]

但它在很多方面都存在歧义。它怎么[知道左边要运行的是命令而不是固定字符串?它怎么知道是==字符串比较运算符,而不仅仅是的参数grep?它怎么知道是|左侧值的一部分,而不是将命令分成 [ prlctl list --info ubuntu-vmgrep State == "State: running" ]

因此左边也需要加引号。另外,由于您想比较输出该命令,而不是“prctl list --info ...”本身,您需要操作$(…)员:

[ "$(prlctl list --info ubuntu-vm | grep State)" == "State: running" ]

答案3

如果我们在 txt 文件中有以下内容并且想要 grep 多个字符串。

minion1:

      ID: php_install
Function: pkg.installed
    Name: php
  Result: True
 Comment: All specified packages are already installed
 Started: 16:19:04.217642
Duration: 587.977 ms

我们可以使用下面的 grep 语句:-

grep -Po '(ID|(?Function)|(?Duration)): (?(fun)\w+.\w+|(?(dur)\d+.\d+ ms|\w+))' high.yxy

为了澄清上述内容,我正在做

P 表示使用聚合酶链反应

o 表示它只会给出匹配输出

?<fun> 它是一个名字函数命名组

我希望这能解决您的问题。

相关内容