Bash字符串包含的数字不是0

Bash字符串包含的数字不是0,bash,Bash,我有一个bash命令,它输出类似的内容。上面和下面都有线 > ... > server1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 > server2 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 >

我有一个bash命令,它输出类似的内容。上面和下面都有线

> ...  
> server1 : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
> server2 : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
> server3 : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
> ...
我试图确定在这些输出中是否存在除changed=0以外的任何数字,不管是哪一个,只要确定在changed=之后,输出中是否包含除0以外的任何数字即可

这是我得到的最好的,但显然不起作用:

#!/usr/bin/env bash

output=`mycommand`

if [[ $output != *"changed=0"* ]]; then
  # Run more code here
fi

您需要更具体地说明“不同于更改的=0”的含义:您是指“更改的=x”,其中x可以是1到9之间的任何值(负数是否可能,浮点数如何)?或者你的意思是“更改=错误”、“更改=正确”也可以吗

如果要查找x介于1和9之间的“changed=x”,可以使用正则表达式:

changed=[1-9]
如果您正在查找除“changed=0”之外的任何内容都可以的情况,您可以选择:

grep -v "changed=0"

如果还有其他可能的情况(负数、浮点数等),请相应地编辑您的问题。

有很多很多方法可以确定这一点。假设您只是在查找任何已更改的字符串,那么您可以使用:

res=$(echo "$output" | grep -P "changed=[^0]")
if [[ $? -eq 0 ]]; then
  # Run more code here
fi
if [[ $output =~ changed=[1-9] ]]; then
    echo "work"
fi
过滤掉更改的=0行后,可以测试文本的存在:

filtered=$(echo "$output" | grep -v 'changed=0')
if [[ -n $filtered ]]; then
    echo "work"
fi
但是,如果您的行不是已更改的行,则这不起作用,因此您可以执行以下操作:

filtered=$(echo "$output" | grep 'changed=' | grep -v 'changed=0')
if [[ -n $filtered ]]; then
    echo "work"
fi

mycommand | grep-v'changed=0'
它接受一个通配符,如果使用
=~
表单,它接受一个正则表达式,因此类似于
[$output=~changed=[1-9]]
应该匹配,如果有一行匹配的
changed=
后跟
1-9
中的任何数字,谢谢@Petesh,显然是
=
而不是
~=
,但这很有效!