5

我想将一个变量与另一个变量减去一个 linux shell 脚本中的常量进行比较。

在 cpp 中,这看起来像这样:

int index = x;
int max_num = y;

if (index < max_num - 1) {
  // do whatever
} else {
  // do something else
}

在外壳中,我尝试了以下操作:

  index=0
  max_num=2
  if [ $index -lt ($max_num - 1) ]; then
    sleep 20
  else 
    echo "NO SLEEP REQUIRED"
  fi

我也试过:

if [ $index -lt ($max_num-1) ]; then
...

if [ $index -lt $max_num - 1 ]; then
...

if [ $index -lt $max_num-1 ]; then
...

但这些版本都不起作用。你如何正确地写出这样的条件?

问候

4

3 回答 3

7

您尝试的各种示例都不起作用,因为在您尝试的任何变体中实际上都没有发生算术运算。

你可以说:

if [[ $index -lt $((max_num-1)) ]]; then
  echo yes
fi

$(( expression ))表示算术表达式

[[ expression ]]是一个条件构造

于 2013-11-07T13:41:58.240 回答
2

便携(普通sh),你可以说

if [ "$index" -lt "$((max_num-1))" ]; then
    echo yes
fi

精简版

[ "$index" -lt "$((max_num-1))" ] && echo yes;

[test程序,但]在调用时需要关闭[。请注意围绕变量所需的引用。使用冗余且不一致的 bash 扩展 cruft ( ) 时不需要引用[[ ... ]]

于 2013-11-07T13:50:01.657 回答
2

bash中,提供了一个更易读的算术命令:

index=0
max_num=2
if (( index < max_num - 1 )); then
  sleep 20
else 
  echo "NO SLEEP REQUIRED"
fi

严格符合 POSIX 的等价物是

index=0
max_num=2
if [ "$index" -lt $((max_num - 1)) ]; then
  sleep 20
else 
  echo "NO SLEEP REQUIRED"
fi
于 2013-11-07T14:36:05.167 回答