2013-11-21 51 views
4

我有這樣的: n的擊弦和平等檢查

if [ "$(./bin/ft_putendl_fd_test.bin)" != "NO__\n" ] 
then 
    echo "Error on ft_putendl_fd." 
fi 

二進制輸出這樣的:NO__\n,其中\n實際上是的ASCII字符20,不只是\\n

但是,我總是得到Error on ft_putendl_fd.

我試過與$'NO__\n'比較,但它似乎也沒有工作。

我正在使用Bash 3.2。

+0

我已經改變因爲第一個連工作都沒有。 – conradkdotcom

回答

1

我會發現最簡單的辦法是這樣的:

if [ "$(./bin/ft_putendl_fd_test.bin | cat -e)" != "$(echo 'NO__' | cat -e)" ] 
then 
    echo "Error on ft_putendl_fd." 
fi 
+0

我會與@ JoSo的解決方案(只是測試與'NO__'平等,讓'bash'修剪尾隨的新行)。但是如果你堅持比較嚴格的平等,那麼如果它沒有尾隨的換行符或者有兩個,那麼它會拒絕程序的輸出,那麼你可以使用'if cmp -s <(./ bin/ft_putendl_fd_test.bin) <(printf'NO __ \ n');' – rici

5

請注意,序列"\n"不會產生換行符。您可以使用$'\n'(不可移植),或只是嵌入換行文字:

myno="NO__"$'\n' 
myno="NO__ 
" 

但在這裏,這不是問題,因爲命令替換被定義爲反正刪除所有尾隨換行符。

這意味着你的測試必須是

[ "$(./bin/ft_putendl_fd_test.bin)" != "NO__" ] 

在極少數情況下,刪除,換行功能可能產生歧義(當你需要有尾隨換行符號來區分)。你不能把它關掉容易,但它是可能的:

x=$(./bin/ft_putendl_fd_test.bin; echo x) 
x=${x%x} 

[ "$x" != "NO__ 
" ] 

或者乾脆:

[ "$(./bin/ft_putendl_fd_test.bin; echo x)" != "NO__ 
x" ] 
+0

您也可以使用'$'NO __ \ n'',因爲'$'...''只是(另一種)引用形式。 – rici

+0

@rici:確實,但並非便攜式 –

+1

@conradk:來吧,請不要接受這個答案。這是你的問題的正確答案。不需要吝嗇:) –