我正在编写一个 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。