\ n在Bash字符串和等式检查中

时间:2013-11-21 16:47:46

标签: bash shell

我有这个:

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。

2 个答案:

答案 0 :(得分: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" ]

答案 1 :(得分:1)

我发现的最简单的解决方案是:

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