如何在Bash中测试字典小于或等于的字典?

时间:2014-01-22 21:58:19

标签: bash

在Bash中,是否有一种简单的方法来测试一个字符串是否按字典顺序小于或等于另一个字符串?

我知道你可以这样做:

if [[ "a" < "b" ]]

用于测试严格的不等式,或

if [[ 1 -le 1 ]]

表示数字。但-le似乎不适用于字符串,使用<=会产生语法错误。

5 个答案:

答案 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