Linux 上奇怪的 if 语句行为

Linux 上奇怪的 if 语句行为

我正在编写一个 shell 脚本并且遇到了一些奇怪的 if 行为。

我的问题很简单,为什么[[ "╝" = [█] ]]求值为真?是因为它们都是不常见的 ASCII 字符吗?在我的 Mac 上,求值正常。

注意:█ 确实需要放在括号中。

答案1

评估不依赖于平台(mac 或其他)。它取决于当前的语言环境设置:

$ LANG=C
$ if [[ "╝" = [█] ]]; then echo y; else echo n; fi
n
$ LANG=en_US.UTF-8
$ if [[ "╝" = [█] ]]; then echo y; else echo n; fi
y

我们可以尝试通过简单的脚本检测哪些语言环境与表达式匹配:

for i in $(locale -a)
do
   export LANG=$i
   echo -n "LANG=$LANG   "
   if [[ "╝" = [█] ]]; then echo yes; else echo no; fi
done

并看到 UTF-8 区域设置与表达式匹配。当区域设置设置为支持 UTF-8 时,bash 会以不同的方式解释 UTF-8 字符,这就是结果不同的原因。

尽管如此,我认为这是一个错误,因为即使设置了支持 UTF-8 的语言环境,它也应该返回 false。

相关内容