比较Bash中按字母顺序排列的字符串、测试与双括号语法
我正在处理一个 Bash 脚本项目,如果它们具有相同的内容,我需要删除两个文件之一。我应该删除一个字母排序,在示例中,我的教授提供了我的教授,Apple.dat是在选择是Apple.dat和Apple.dat时删除。
if [[ "apple" > "Apple" ]]; then
echo apple
else
echo Apple
fi
打印苹果
echo $(echo -e "Applenapple" | sort | tail -n1)
打印苹果
a的ASCII值是97,A是65,为什么测试说A更大?
奇怪的是,我用旧的语法得到了相反的结果:
if [ "apple" > "Apple" ]; then
echo apple
else
echo Apple
fi
打印苹果
如果我们尝试在 [[ ]] 语法中使用 >,则会出现语法错误。
我们如何针对双括号语法更正此问题?我已经在学校的 Debian 服务器、我的本地机器和我的 Digital Ocean Droplet 服务器上测试过这个。在我本地的 Ubuntu 20.04 和学校服务器上,我得到了上述输出。有趣的是,在我的 Digital Ocean Droplet(Ubuntu 20.04 服务器)上,我得到了带有双括号和单括号语法的“apple”。我们可以使用语法、双括号或单括号实际测试调用,但是我更喜欢使用较新的双括号语法,并且宁愿学习如何使这项工作而不是将我大部分完成的脚本转换为更旧的更符合 POSIX 的语法.
回答
提示:
$ (LC_COLLATE=C; if [ "apple" > "Apple" ]; then echo apple; else echo Apple; fi)
apple
$ (LC_COLLATE=en_US; if [ "apple" > "Apple" ]; then echo apple; else echo Apple; fi)
apple
但:
$ (LC_COLLATE=C; if [[ "apple" > "Apple" ]]; then echo apple; else echo Apple; fi)
apple
$ (LC_COLLATE=en_US; if [[ "apple" > "Apple" ]]; then echo apple; else echo Apple; fi)
Apple
不同之处在于 Bash 特定测试[[ ]]使用语言环境归类规则来比较字符串。而 POSIX 测试[ ]使用 ASCII 值。
从 bash 手册页:
使用 with 时
[[,<and>运算符使用当前语言环境按字典顺序排序。与
testor 一起使用时[,<and>运算符使用 ASCII 顺序按字典顺序排序。