如何在Linux shell脚本中比较变量和减去常量后的变量?

5
我希望您能在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个回答

7
你尝试的各种示例都无法正常工作,因为在你尝试的任何变体中实际上并没有进行任何算术操作。
你可以这样说:
if [[ $index -lt $((max_num-1)) ]]; then
  echo yes
fi

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

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


双括号([[]]和(()))的意义是什么? - marekful

3

从可移植性角度来说(纯 sh),您可以这样说:

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

简短版

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

[是测试程序,但在被调用为[时需要关闭]。请注意变量周围的引号是必需的。使用多余和不一致的Bash扩展([[...]])时,不需要使用引号。


2
在中,有一个更易读的算术命令可用:
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

+1 对于完美的 bash 解决方案! - gniourf_gniourf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接