gpt4 book ai didi

linux - 比较 Bash 中按字母顺序排列的字符串、测试与双括号语法

转载 作者:行者123 更新时间:2023-12-03 23:00:24 25 4
gpt4 key购买 nike

我正在处理一个 Bash 脚本项目,如果它们具有相同的内容,我需要删除两个文件之一。我应该删除一个字母排序,在示例中,我的教授提供了我的教授,Apple.dat是在选择是Apple.dat和Apple.dat时删除。

if [[ "apple" > "Apple" ]]; then
echo apple
else
echo Apple
fi
打印苹果
echo $(echo -e "Apple\napple" | 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 手册页:

When used with [[, the < and > operators sort lexicographically using the current locale.

When used with test or [, the < and > operators sort lexicographically using ASCII ordering.

关于linux - 比较 Bash 中按字母顺序排列的字符串、测试与双括号语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66298321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com