在Bash中,是否有一种简单的方法来测试一个字符串是否按字典顺序小于或等于另一个字符串?
我知道你可以这样做:
if [[ "a" < "b" ]]
用于测试严格的不等式,或
if [[ 1 -le 1 ]]
表示数字。但-le
似乎不适用于字符串,使用<=
会产生语法错误。
答案 0 :(得分:37)
只是否定大于测试:
if [[ ! "a" > "b" ]]
答案 1 :(得分:6)
您需要使用||
而使用其他条件而不是<=
:
[[ "$a" < "$b" || "$a" == "$b" ]]
答案 2 :(得分:1)
您可以翻转比较并签名并进行消极测试:
$ a="abc"
$ b="abc"
$ if ! [[ "$b" > "$a" ]] ; then echo "a <= b" ; fi
a <= b
如果要整理“A”序列,则“a”,然后“B”...使用:
shopt -s nocaseglob
答案 3 :(得分:1)
如果可以使用Bash语法,请参阅@anubhava和@ gordon-davisson的答案。使用POSIX语法,您有两个选择(请注意必要的反斜杠!):
使用-o
运算符(OR):
[ "$a" \< "$b" -o "$a" = "$b" ] && echo "'$a' LTE '$b'" || echo "'$a' GT '$b'"
或使用否定符:
[ ! "$a" \> "$b" ] && echo "'$a' LTE '$b'" || echo "'$a' GT '$b'"
我更喜欢第一个变体,因为恕我直言,它更具可读性。
答案 4 :(得分:0)
expr
POSIX方法
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/expr.html
[ "$(expr abc \< acb)" = 1 ] || echo fail
[ "$(expr abc \< aac)" = 0 ] || echo fail
POSIX说expr
确定参数是整数还是常规字符串,以及字符串比较:
使用特定于语言环境的归类序列返回字符串比较的结果
sort
POSIX解决方法
只是为了好玩,请改用expr
。
对带有换行符的字符串不是无限健壮,但是在处理shell脚本时是什么时候?
string_lte() (
s="$(printf "${1}\n${2}")"
if [ "$(printf "$s" | sort)" = "$s" ]; then
exit 0
else
exit 1
fi
)
string_lte abc adc || echo fail
string_lte adc adc || echo fail
string_lte afc adc && echo fail