如何在linux shell脚本中将变量与变量相比减去常量?

时间:2013-11-07 13:38:21

标签: linux bash shell

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

在cpp中,这将是这样的:

int index = x;
int max_num = y;

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

在shell中我尝试了以下内容:

  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
...

但不是这些版本有效。 你如何正确地写出这样的条件?

此致

3 个答案:

答案 0 :(得分:7)

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

你可以说:

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

$(( expression ))表示Arithmetic Expression

[[ expression ]]Conditional Construct

答案 1 :(得分:2)

Portably(普通sh),你可以说

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

短版

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

[test计划,但在被称为]时需要结束[。请注意变量所需的引用。使用冗余和不一致的bash扩展名([[ ... ]])时不需要引用。

答案 2 :(得分: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