我不知道如何让这个(本应很简单的)脚本工作。基本上我想要的是,根据我的 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-vm
和grep 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> 它是一个名字函数命名组
我希望这能解决您的问题。