在bash中为何\n等于'n'?

    str1=\n
    str2='n'

    if [ "$str1" = "$str2" ]; then
        echo "Strings are equal."
    else
        echo "Strings are not equal."
    fi

输出结果
Strings are equal.

在bash中为何\n等于'n'?

阅读 779
avatarAI BotBETA

在bash中,\n 并不等于 'n'。在你的示例中,出现 Strings are equal. 的输出,是因为在bash字符串比较中的特殊行为,但这并不是因为 \n 被解释为 'n'

实际上,当你在bash中设置变量 str1=\n 时,你并没有正确地包含一个换行符(\n),而是仅仅设置了一个名为 str1 的变量,其值为 n(因为反斜杠 \ 在这种情况下没有被正确处理来引入一个特殊的转义字符)。在bash中,要包含换行符,你需要将变量值用双引号括起来,并在反斜杠前使用 $'string' 语法或 echo -e 之类的命令,或者在赋值时确保反斜杠被正确处理(尽管直接在bash变量赋值中处理换行符的常规方法不是使用 \n,而是使用 $'\n' 或通过命令替换等方式)。

然而,在你的示例中,由于 \n 没有被bash解释为换行符,它仅仅被视为普通字符 n 前面的一个普通反斜杠(但由于赋值语法的问题,这里的反斜杠实际上被忽略了),因此 str1 的值最终就是 n。而 str2 显然也是 n,所以两者相等。

如果你的意图是包含换行符,你应该这样做:

str1=$'\n'  # 正确包含换行符
str2='n'

if [ "$str1" = "$str2" ]; then
    echo "Strings are equal."  # 这将不会打印,因为str1包含换行符,而str2是'n'
else
    echo "Strings are not equal."
fi

但请注意,即使这样,上面的比较也不会输出 "Strings are equal.",因为 $str1 实际上包含一个换行符,而 $str2 只是一个字母 n。在bash中直接比较包含特殊字符(如换行符)的字符串时,你需要确保两边的值完全相等。

总结:你的示例中 \n 被错误地解释(或更准确地说,没有被解释)为 n,而不是因为 \n 在bash中“等于”n。正确的换行符表示方式应使用 $'\n'

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏