Bash:比较两个带空格的字符串

雨果

我正在尝试编写一个运行命令的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

这行对我来说也有点可疑。我也可以$STATUS通过将其用双引号引起来保护它的内容

TEST=`echo "$STATUS"`

另外,我会放下反勾号(`...`),并使用$( ... )符号代替执行该命令。此项更改仅是最佳做法,但不属于您的问题。

TEST=$(echo "$STATUS")

输出中的控制字符(^ [[92mON ^ [[0m主设备]

鉴于您在输出(^[[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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

比较两个带连字符/破折号的Python字符串

来自分类Dev

Bash字符串比较两个相同的字符串是否为假?

来自分类Dev

ElasticSearch聚合:带空格的字符串被视为两个字符串

来自分类Dev

Bash:将空格字符串读入两个变量的最简洁方法

来自分类Dev

使用Mac bash比较两个文件中重复的字符串

来自分类Dev

如何在bash中将两个相似的字符串与通配符进行比较?

来自分类Dev

比较两个JavaScript字符串日期

来自分类Dev

如何比较两个乱序的字符串?

来自分类Dev

比较Android中的两个波斯字符串

来自分类Dev

PHP比较两个密码字符串

来自分类Dev

比较两个日期作为字符串

来自分类Dev

比较两个CSV的相似字符串

来自分类Dev

用awk比较字符串两个文件

来自分类Dev

比较两个文件中的字符串

来自分类Dev

比较SQL中的两个时间字符串

来自分类Dev

两个unicode字符串的无用比较

来自分类Dev

比较两个加密的字符串与河豚-php

来自分类Dev

PHP比较两个密码字符串

来自分类Dev

如何比较两个日期字符串的值?

来自分类Dev

比较两个逗号分隔的字符串

来自分类Dev

使用 .equals 比较两个单字符串

来自分类Dev

在字符后用空格/两个空格分隔字符串

来自分类Dev

Bash提取两个模式之间的字符串

来自分类Dev

比较两个字符串,忽略空格、换行、换行

来自分类Dev

仅当存在两个或多个空格时才替换字符串中的空格

来自分类Dev

无法通过从 bash 调用 perl oneliner 来比较两个版本字符串

来自分类Dev

如何用两个不同的字符替换字符串中的空格?

来自分类Dev

java字符串替换两个不同特殊字符之间的空格

来自分类Dev

带/不带空格的Bash字符串操作

Related 相关文章

热门标签

归档