如果-比较两个字符串

时间:2018-12-04 06:51:01

标签: string bash if-statement

我正在尝试将命令的输出与字符串进行比较。

# 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

我正在尝试找到一种方法来删除它们。

5 个答案:

答案 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 retiredPrevious 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" ; }