【问题标题】:bash 'if' test fails with value greater than 99 (2 digits) [duplicate]bash 'if' 测试失败,值大于 99(2 位)[重复]
【发布时间】:2020-03-19 15:29:27
【问题描述】:

在我不理解的 bash shell 脚本中发现了一个奇怪的地方。在下面的代码序列中,定义了两个字符串;一个长度为 99 个字符,一个长度为 100 个字符。将每个字符串的长度与值 3 进行比较。如果使用“

我有两个问题: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

【问题讨论】:

  • 不要使用反引号`。请改用$(...)。不要使用expr。只需lng99=${#string99}

标签: bash if-statement


【解决方案1】:

这是因为-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

【讨论】:

  • 谢谢。我认为这是一个功能而不是错误。我的思绪陷入了整数模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 2013-05-04
  • 2014-03-13
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多