在运行 freeMemory.sh 脚本时,出现 line 16: [: : integer expression expected 错误,这是由于第 16 行的 if 语句中,$1 没有被定义或传入值,导致无法进行比较。

错误原因分析:

  • 脚本第 16 行的 if [ $rate -gt $1 ] 语句用于判断内存使用率是否超过了指定阈值。* $1 代表传入脚本的第一个参数,用于指定内存使用率的阈值。* 如果运行脚本时没有传入参数,$1 就没有值,导致 if 语句无法进行比较,从而报错。

解决方案:

  1. 检查脚本调用方式: 确认运行脚本时是否传入了参数,例如 ./freeMemory.sh 80,其中 80 代表内存使用率阈值。

  2. 添加参数判断: 在脚本中添加判断,如果未传入参数,则使用默认值,例如:

#!/bin/sh

# 内存总量
total=$( free -m | grep Mem | awk '{print $2}')
# 已使用内存
used=$( free -m | grep Mem | awk '{print $3}')
# 空闲内存
free=$( free -m | grep Mem | awk '{print $4}')
# 内存使用率
rate=$((($total-$free)*100/$total))

time=$(date)
echo '############$(date)###############'

# 如果未传入参数,则使用默认值 80
maxMem=${1:-80}

if [ $rate -gt $maxMem ]
then
echo 'rate=$rate    freeMemory start!'
sync
sudo sh -c 'echo 3 >> /proc/sys/vm/drop_caches'
echo 'FreeMemory Success!'
else
echo 'rate=$rate  Memory is normal'
fi

脚本代码分析:

  • 第 1-5 行: 获取系统内存信息,包括总量、已使用、空闲和使用率。
  • 第 7 行: 获取当前时间,并将其保存到 time 变量中。
  • 第 8 行: 打印时间信息。
  • 第 11 行: 判断内存使用率是否超过阈值。
  • 第 12-15 行: 如果内存使用率超过阈值,则执行清理内存操作。
  • 第 16-17 行: 如果内存使用率未超过阈值,则输出提示信息。

优化建议:

  • 使用 $() 获取命令返回值: 第 12 行的 time=date 应该改为 time=$(date),使用 $() 获取 date 命令的返回值,并将返回值赋值给 time 变量。
  • 规范脚本格式: 统一使用单引号 ' ' 包裹字符串,并保持代码格式整洁。
  • 添加注释: 为脚本代码添加必要的注释,提高代码可读性。

经过修改后的脚本代码:

#!/bin/sh

# 内存总量
total=$( free -m | grep Mem | awk '{print $2}')
# 已使用内存
used=$( free -m | grep Mem | awk '{print $3}')
# 空闲内存
free=$( free -m | grep Mem | awk '{print $4}')
# 内存使用率
rate=$((($total-$free)*100/$total))

time=$(date)
echo '############$(date)###############'

# 如果未传入参数,则使用默认值 80
maxMem=${1:-80}

if [ $rate -gt $maxMem ]
then
echo 'rate=$rate    freeMemory start!'
sync
sudo sh -c 'echo 3 >> /proc/sys/vm/drop_caches'
echo 'FreeMemory Success!'
else
echo 'rate=$rate  Memory is normal'
fi

通过以上解决方案和优化建议,您就可以解决 freeMemory.sh 脚本的报错问题,并使脚本代码更加规范和高效。

freeMemory.sh 脚本报错:  line 16: [: : integer expression expected

原文地址: https://www.cveoy.top/t/topic/n5jC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录