字符串在Bash中看起来相同但不相等

时间:2017-07-16 01:53:01

标签: bash sed

在以下命令序列中,为什么第二个if未评估为true?

[m1@qa-node11:~]a="true"
[m1@qa-node11:~]if [ "$a" = "true" ]; then  echo "hi5"; fi
hi5

上述if按预期评估为true。但...

[m1@qa-node11:~]a=$(head -n 1 $CLUSTERS_CONF | grep secure= | sed 's/^.*secure=//' | sed 's/ .*$//')
[m1@qa-node11:~]echo $a
true
[mapr@qa-node11:~]if [ "$a" = "true" ]; then  echo "hi5"; fi
[mapr@qa-node11:~]

为什么此if未评估为true

我甚至检查过$a是否有任何额外的不可打印字符

[mapr@qa-node11:~]echo "'"$a"'"
'true'

我错过了什么?

1 个答案:

答案 0 :(得分:1)

根据这一观察结果:

[mapr@qa-node11:~]echo "'$a'"
'true'
[mapr@qa-node11:~]if [ "$a" = "true" ]; then echo "hi5"; fi
[mapr@qa-node11:~]

很明显,$a包含一些不可见的内容。

查看隐身字符的好方法是使用hexdump工具。 例如,如果值真的只是“真”, 我们应该看到这个:

$ printf true | hexdump -C
00000000  74 72 75 65                                       |true|
00000004

您可以使用带有s/[^a-z]//g的{​​{1}}命令过滤掉非字母字符:

sed

顺便说一句,这条管道可以简化:

a=$(head -n 1 $CLUSTERS_CONF | grep secure= | sed -e 's/^.*secure=//' -e 's/ .*$//' -e 's/[^a-z]//g')