期望整数表达式,它太大了吗?

时间:2016-11-25 12:32:46

标签: bash integer

我尝试运行此代码,来自aerospike' start script

  mem=`/sbin/sysctl -n kernel.shmall`
  min=4294967296
  if [ $mem -lt $min ]
  then
    info "kernel.shmall too low, setting to 4G pages"
    /sbin/sysctl -w kernel.shmall=$min
  fi

  mem=`/sbin/sysctl -n kernel.shmmax`
  min=1073741824
  if [ "$mem" -lt $min ]
  then
    info "kernel.shmmax too low, setting to 1GB"
    /sbin/sysctl -w kernel.shmmax=$min
  fi

但它显示:

bash: [: 18446744073692774399: integer expression expected
bash: [: 18446744073692774399: integer expression expected

是因为它大于9223372036854775807吗?有没有解决方法呢?

编辑是的,因为它大于该数字:

if [ 18446744073692774399 -lt 9223372036854775807 ]; then echo 1; fi
bash: [: 18446744073692774399: integer expression expected
if [ 1844674407369277439 -lt 9223372036854775807 ]; then echo 1; fi
1

2 个答案:

答案 0 :(得分:2)

/sbin/sysctl -n kernel.shmall报告的数字接近无符号64位整数的最大值。但是Bash使用了有符号整数。所以它不会起作用。

由于数字的唯一用途是检查它是否太小,您应该更改代码以首先检查数字的长度。如果数字长于基数10位数的阈值,则表示它更大。

答案 1 :(得分:0)

没关系,先通过检查长度找到一个临时的solution

set_shmall() {
  mem=`/sbin/sysctl -n kernel.shmall`
  min=4294967296
  if [ ${#mem} -le ${#min} ] 
  then
    if [ $mem -lt $min ]
    then
      info "kernel.shmall too low, setting to 4G pages"
      /sbin/sysctl -w kernel.shmall=$min
    fi
  fi
}

set_shmmax() {
  mem=`/sbin/sysctl -n kernel.shmmax`
  min=1073741824
  if [ ${#mem} -le ${#min} ] 
  then
    if [ $mem -lt $min ]
    then
      info "kernel.shmmax too low, setting to 1GB"
      /sbin/sysctl -w kernel.shmmax=$min
    fi
  fi
}