为何使用<、>、=比较字符串时会出现异常输出?
字符串比较输出异常的原因与解决办法
你遇到的问题核心是混淆了shell里的重定向符号和字符串比较运算符,并不是比较逻辑本身有问题。
为什么会出现这种反直觉的输出?
在Bash这类shell中,直接写"a"<"b"时,<不是用来比较字符串的运算符,而是输入重定向符号。这个命令的实际含义是:
尝试运行名为
a的可执行程序,同时把名为b的文件内容作为它的输入。
你看到的输出(0或1)是这个命令的执行退出码:0表示命令执行成功,非0表示失败。对应你的情况:
- 第一段里
"a"<"a"输出0:说明当前目录下存在可执行文件a,同时存在文件a,命令能正常执行,所以退出码0。 "b"<"a"输出1:当前目录下没有名为b的可执行程序,命令执行失败,退出码1。"a"<"b"输出0:当前目录下有可执行文件a和文件b,命令执行成功,退出码0。- 第二段里
"a"<"b"输出1:大概率是文件b被删除/移动,或者你切换了目录,导致输入重定向找不到文件b,命令执行失败,退出码1。
正确的字符串比较方式
如果要在shell中用</>比较字符串,必须用正确的语法,让shell把它们解析为比较运算符:
- 使用
[[ ... ]]结构(推荐):
# 比较"a"和"a",结果为假,退出码1 [[ "a" < "a" ]] && echo "真" || echo "假" # 比较"b"和"a",结果为假,退出码1 [[ "b" < "a" ]] && echo "真" || echo "假" # 比较"a"和"b",结果为真,退出码0 [[ "a" < "b" ]] && echo "真" || echo "假"
- 使用
test命令([ ... ]),需要转义<避免被解析为重定向:
[ "a" \< "a" ] && echo "真" || echo "假" [ "b" \< "a" ] && echo "真" || echo "假" [ "a" \< "b" ] && echo "真" || echo "假"
字符串比较是按ASCII值来的,"a"的ASCII码是97,"b"是98,所以"a"<"b"的正确结果是真(退出码0)。
内容的提问来源于stack exchange,提问作者amit_fiend
相关产品推荐
相关产品推荐

