我正在尝试编写一个运行命令的bash脚本,并将结果与另一个字符串进行比较。
#!/bin/bash -x
STATUS=`/root/setup_ha show --password-file=/root/password | grep ">HA State" | awk '{print $3}' | cut -c 2-`
TEST=`echo $STATUS`
if [[ "$TEST" == "ON Master" ]];
then echo CLUSTER CRITICAL
else
echo CLUSTER OK MASTER
fi
由于原始字符串位于两行,因此在新变量TEST中回显它。New变量在一行上显示命令的输出。
这是Bash调试输出:
++ /root/setup_ha show --password-file=/root/password
++ grep '>HA State'
++ awk '{print $3}'
++ cut -c 2-
+ STATUS='ON
Master'
++ echo 'ON' Master
+ TEST='ON Master'
+ [[ ON Master == \O\N\ \M\a\s\t\e\r ]]
+ echo CLUSTER OK MASTER
CLUSTER OK MASTER
我还尝试了以下测试:
if [[ "$TEST" =~ "ON Master" ]]
问题是bash无法比较字符串,因此始终为假。
任何的想法 ?
编辑 :
这是第一个答案的输出:
+ STATUS='ON
Master'
++ echo 'ON' Master
+ TEST='ON Master'
+ '[' 'ON Master' == 'ON Master' ']'
+ echo CLUSTER OK MASTER
CLUSTER OK MASTER
仍然无法正常工作似乎在第3行很奇怪,而且在我的bash中它需要绿色!
更改此行:
if [[ "$TEST" == "ON Master" ]];
对此:
if [ "$TEST" == "ON Master" ];
问题是的使用[[ .. ]]
。输出显示出差异。您获得的价值$STATUS
不仅仅在于“掌握”。它很可能包含其他字符,这些字符很可能无法打印,因此无法看到。
[[..]]
++ echo On Master
+ TEST='On Master'
+ [[ On Master == \O\N\ \M\a\s\t\e\r ]]
[..]
++ echo On Master
+ TEST='On Master'
+ '[' 'On Master' == 'ON Master' ']'
在TLDP高级Bash脚本页面上讨论了双方括号([[ .. ]]
)的使用。
这行对我来说也有点可疑。我也可以$STATUS
通过将其用双引号引起来来保护它的内容。
TEST=`echo "$STATUS"`
另外,我会放下反勾号(`...`),并使用$( ... )
符号代替执行该命令。此项更改仅是最佳做法,但不属于您的问题。
TEST=$(echo "$STATUS")
鉴于您在输出(^[[92m
&^[[0m
)中看到了这些控制字符,因此我很怀疑该grep
命令会将这些字符引入到管道中的输出中。可能grep
总是包含--color
开关的是别名,我暂时尝试直接调用可执行文件,并传递可能存在的任何别名。只需将更grep
改为即可/bin/grep
。
这些的存在是我们怀疑的原因,也是为什么当您echo
使用变量时文本会换行的原因$STATUS
。这些字符不可打印,并且会更改终端的颜色以突出显示grep
已找到的匹配项。
这些的存在也解释了为什么=~
操作员也不匹配。你试图以匹配'On Master'
与'^[[92mON^[[0m Master'
。
最后,带有控制字符的彩色输出可能来自之前的其他工具grep
。我需要查看来自的实际输出/root/setup_ha
以确认这一点,但是在管道流中生成这些字符时,我也会对该工具产生怀疑。
我发现此标题为“ U&L”的问答:程序将STDIN传递给STDOUT,并且剥离了颜色代码?。
使用这两种方法之一摆脱控制字符。
佩尔
$ cmd-with-colored-output | perl -pe 's/\e\[?.*?[\@-~]//g'
然而,
$ cmd-with-colored-output | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句