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'?
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'?
在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'
。