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

con*_*com 4 bash shell

我有这个:

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

二进制输出:NO__\n,其中\n实际上是ASCII字符20,而不仅仅是\\n.

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

我试过比较,$'NO__\n'但它似乎也没有用.

我正在使用Bash 3.2.

Jo *_* So 5

请注意,序列"\n"不会产生换行符.您可以使用$'\n'(不可移植)或仅将换行符嵌入文本:

myno="NO__"$'\n'
myno="NO__
"
Run Code Online (Sandbox Code Playgroud)

但这不是问题,因为命令替换被定义为无论如何都要删除所有尾随的换行符.

这意味着你的测试必须是

[ "$(./bin/ft_putendl_fd_test.bin)" != "NO__" ]
Run Code Online (Sandbox Code Playgroud)

在极少数情况下,删除换行符功能可能会产生歧义(当您需要通过尾随换行符的数量进行区分时).你无法轻易关闭它,但它有可能:

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

[ "$x" != "NO__
" ]
Run Code Online (Sandbox Code Playgroud)

或者干脆:

[ "$(./bin/ft_putendl_fd_test.bin; echo x)" != "NO__
x" ]
Run Code Online (Sandbox Code Playgroud)

  • @conradk:来吧,请取消接受这个答案.这是你的问题的正确答案.不需要吝啬:) (2认同)