首页 > 解决方案 > bash 'if' 测试失败,值大于 99(2 位)

问题描述

在我不理解的 bash shell 脚本中发现了一个奇怪的地方。在下面的代码序列中,定义了两个字符串;一个长度为 99 个字符,一个长度为 100 个字符。将每个字符串的长度与值 3 进行比较。如果使用“<”运算符,则如果第一个符号操作数的值大于 99(2 位),则测试失败。如果使用“-lt”运算符,则测试对于大于 99 的值可以正常工作。

我有两个问题:1)为什么?2)这是一个错误还是一个功能?

#/bin/bash

string99="abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqrstuvwxy"
string100="abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqrstuvwxyz"
lng99=`expr length $string99`
lng100=`expr length $string100`

echo 
echo "-- 99 --------- if [[ \$lng < 3 ]] -----------------"

  if [[ $lng99 < 3 ]]
  then
    echo "$string99 is $lng99 characters long."
  else
    echo "length of string is greater than 3"
  fi

echo 
echo "-- 99 -------- if [[ \$lng -lt 3 ]] ----------------"
  if [[ $lng99 -lt 3 ]]
  then
    echo "$string99 is $lng99 characters long."
  else
     echo "length of string is greater than 3"
  fi

echo 
echo "-- 100 -------- if [[ \$lng < 3 ]] -----------------"

  if [[ $lng100 < 3 ]]
  then
    echo "$string100 is $lng100 characters long."
  else
    echo "length of string is greater than 3"
  fi

echo 
echo "-- 100 ------- if [[ \$lng -lt 3 ]] ----------------"
  if [[ $lng100 -lt 3 ]]
  then
    echo "$string100 is $lng100 characters long."
  else
     echo "length of string is greater than 3"
  fi

这个测试序列的输出是:

-- 99 --------- if [[ $lng < 3 ]] -----------------
length of string is greater than 3

-- 99 -------- if [[ $lng -lt 3 ]] ----------------
length of string is greater than 3

-- 100 -------- if [[ $lng < 3 ]] -----------------
abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890abcdefghijklmnopqrstuvwxyz is 100 characters long.

-- 100 ------- if [[ $lng -lt 3 ]] ----------------
length of string is greater than 3

标签: bashif-statement

解决方案


那是因为-lt(还有-gt, -ne,-eg等)用于数值比较。另一个按字典顺序比较字符串。

$ [[ "abc" < "bcd" ]] || echo "nope"
$ [[ "cbc" < "bcd" ]] || echo "nope"
nope
$ [[ "abc" -lt "bcd" ]] || echo "nope"
nope
$ [[ "cbc" -lt "bcd" ]] || echo "nope"
nope

我可以通过使用[而不是显示它[[

$ [ "abc" -lt 0 ] || echo nope
bash: [: abc: integer expression expected
nope

推荐阅读