我正在尝试将命令的输出与字符串进行比较。
# echo "$status"
Stateretired
# if [ "$status" == "Stateretired" ] ; then echo "Instance down"; else echo "Well nah"; fi
Well nah
#
尝试使用单个=
,但结果相同。
# echo "$status"
Stateretired
# if [ $status = "Stateretired" ] ; then echo "Instance retired"; else echo "Well nah"; fi
Well nah
通过调试,我发现比较'[' Stateretired == 'Stateretired' ']'
很奇怪。正常吗?希望不是。
++ grep State
++ sed -E 's/ +//g ; s/\|//g'
+ status='Stateretired'
+ echo 'Stateretired'
Stateretired
+ mystatus=Stateretired
+ '[' Stateretired == 'Stateretired' ']'
+ echo 'Instance not down'
Instance not down
在继续调试时,我知道颜色编码导致了此问题。
echo "$status" | tr -d '[:cntrl:]'
State[31mretired[0m
我正在尝试找到一种方法来删除它们。
答案 0 :(得分:1)
如您所见,控制字符使字符串变得不同。
您可以尝试删除控制字符。另一种方法是跳过它们:
status="State[control characters]retired[more control characters]"
if [[ "${status}" =~ State.*retired ]]; then
echo "Instance down"
else
echo "Well nah"
fi
当状态可以包含诸如State is not retired
或Previous State was retired, now back to work
之类的值时,此解决方案将失败。
答案 1 :(得分:0)
您应该使用=而不是==
这应该有效!
# echo "$status"
Stateretired
# if [ "$status" = "Stateretired" ] ; then echo "Instance down"; else echo "Well nah"; fi
#
答案 2 :(得分:0)
由于我的输出是彩色的,因此我尝试使用tr
进行确认。
echo "$status" | tr -d '[:cntrl:]'
State[31mretired[0m
通过搜索,我遇到了一个sed
正则表达式,它将删除它们
sed -r 's/\x1B\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g'
下面是我的调试跟踪
++ grep State
++ sed -E 's/ +//g ; s/\|//g'
+ status='Stateretired'
++ echo 'Stateretired'
++ sed -r 's/\x1B\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g'
+ status=Stateretired
+ echo Stateretired
Stateretired
+ mystatus=Stateretired
+ '[' Stateretired == Stateretired ']'
+ echo 'Instance Down'
Instance Down
希望有帮助。
答案 3 :(得分:0)
如果您确切知道期望的颜色顺序,则一种选择是将其简单地包含在要比较的字符串中:
if [ "$status" == $'State\x1B[31mretired\x1B[0m' ] ; then
其中$'...'
是一种特殊的引用符号,它支持反斜杠转义,例如\n
和\xHH
等;有关更多信息,请参见the Bash Reference Manual, §3.1.2.4 "ANSI-C Quoting"。
也就是说,您可能要检查要捕获其输出的命令的文档;它可能支持一些选项,以使输出格式更易于编写脚本。
答案 4 :(得分:-1)
这很简单:
test "a" = "a" && { echo "OK" ; } || { echo "NO" ; }