freeMemory.sh 脚本报错: line 16: [: : integer expression expected
在运行 freeMemory.sh 脚本时,出现 line 16: [: : integer expression expected 错误,这是由于第 16 行的 if 语句中,$1 没有被定义或传入值,导致无法进行比较。
错误原因分析:
- 脚本第 16 行的
if [ $rate -gt $1 ]语句用于判断内存使用率是否超过了指定阈值。*$1代表传入脚本的第一个参数,用于指定内存使用率的阈值。* 如果运行脚本时没有传入参数,$1就没有值,导致if语句无法进行比较,从而报错。
解决方案:
-
检查脚本调用方式: 确认运行脚本时是否传入了参数,例如
./freeMemory.sh 80,其中80代表内存使用率阈值。 -
添加参数判断: 在脚本中添加判断,如果未传入参数,则使用默认值,例如:
#!/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 脚本的报错问题,并使脚本代码更加规范和高效。
原文地址: https://www.cveoy.top/t/topic/n5jC 著作权归作者所有。请勿转载和采集!