2017-07-16 62 views
0

在以下命令序列中,爲什麼第二個if未計算爲真?字符串在Bash中看起來相同但不相等

[[email protected]:~]a="true" 
[[email protected]:~]if [ "$a" = "true" ]; then echo "hi5"; fi 
hi5 

上面if,正如所料,評價爲true。但是......

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

爲什麼這個if不計算true

我甚至檢查,看看是否有$a任何額外的非打印字符

[[email protected]:~]echo "'"$a"'" 
'true' 

我缺少什麼?基於這一觀察

+1

將你的第二個'echo $ a'改爲'echo「$ a」XYZ「並查看你的尾部是否有空白'$ a'的值。祝你好運。 – shellter

+2

將'set -x'添加到您的bash shell中,然後重新運行這些命令。 'set -x'顯示shell實際解釋的內容,是調試bash/ksh shell腳本的常用方法。 – tk421

+1

運行'echo「$ a」| hexdump -C'讓我們看看你得到了什麼 – janos

回答

1

[[email protected]:~]echo "'$a'" 
'true' 
[[email protected]:~]if [ "$a" = "true" ]; then echo "hi5"; fi 
[[email protected]:~] 

顯而易見的是,$a含有看不見的東西。

查看不可見字符的好方法是使用hexdump工具。 例如,如果該值真的僅僅是「真」, 我們應該看到這一點:

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

可以過濾掉使用s/[^a-z]//g命令非字母字符sed

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

順便說一句這個流水線可以簡化:

a=$(sed -ne 's/[^a-z]//g' -e 's/^.*secure=//p' -e 1q "$CLUSTERS_CONF") 
+0

非常感謝。 hexdump清楚地顯示了這個問題。 –

+0

@KarthikM如果這對你有幫助,那麼也許你可以標記我接受的答案? (請參閱投票按鈕下方的管道圖標) – janos

+0

標記爲已接受。 hexdump幫助我發現我正在閱讀和過濾conf文件中的行的方式有問題。 但您提供的兩個sed過濾器不起作用。 '[m1 @ qa-node11:〜] a = $(head -n 1 $ CLUSTERS_CONF | grep secure = | sed -e's /^.* secure = //'-e's /。* $//'-e's/[^ az] // g') [m1 @ qa-node11:〜] echo $ a mtrue [m1 @ qa-node11:〜] a = $(sed -ne's/[^ az] // g'-e's /^.* secure = // p'-e 1q「$ CLUSTERS_CONF」) [m1 @ qa-node11:〜] echo $ a [m1 @ qa -node11:〜]' conf文件中的數據是 foo.dev.cluster.com secure = true qa-node100.qa。實驗室:2222 –

相關問題