在以下命令序列中,为什么第二个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'
我错过了什么?
答案 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')