Bash脚本执行报错expr: unexpected argument,求语法问题排查
排查并修复Docker Desktop RAM检查脚本的语法错误
问题分析
你的脚本存在三个关键语法问题,直接导致了expr: syntax error和变量不替换的异常:
- 内存数值提取错误:
grep MemTotal /proc/meminfo返回的是整行文本(例如MemTotal: 32489356 kB),直接传给expr做除法时,非数字内容会触发语法错误。 - if条件判断语法错误:Bash中不能用
($RAM_GB > 4)的写法,()会将内容当作命令执行,且>是重定向符号,数值比较需用-gt(greater than)运算符,判断结构要用[ ]或[[ ]]。 - 变量替换失效:单引号包裹的字符串中变量不会被解析,导致输出
$RAM_GB而非实际内存数值。
修正后的脚本
#!/bin/bash CURRENT_TIME="$(date +"%x %r %Z")" TIMESTAMP="Generated $CURRENT_TIME, by $USER" echo "$TIMESTAMP" check_ram () { # 提取MemTotal行的纯数字部分(单位KB) RAM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}') # 计算GB值(1GiB=1048576KB,若需十进制GB可换回1000000) RAM_GB=$(expr $RAM_KB / 1048576) if [ $RAM_GB -gt 4 ]; then echo "Your System RAM is: $RAM_GB GB and that meets the minimum requirements for Docker Desktop." else echo "Your computer does not meet the minimum RAM requirements." exit 0 fi } # 调用检查函数 check_ram
关键修改说明
- 提取纯数字内存值:用
awk '{print $2}'从MemTotal行中提取第二列的数字,确保RAM_KB是纯数值,避免expr报错。 - 修正if条件逻辑:用
[ $RAM_GB -gt 4 ]做数值大于判断,符合Bash语法规范;若需更灵活的判断也可使用[[ $RAM_GB -gt 4 ]]。 - 修复变量输出:将echo的单引号改为双引号,确保
$RAM_GB被解析为实际内存数值。 - 准确单位换算:将
1000000改为1048576(符合二进制内存单位换算),若需十进制GB可换回原数值。 - 添加函数调用:原脚本仅定义了
check_ram函数未执行,添加check_ram触发检查逻辑。
内容的提问来源于stack exchange,提问作者Vegas588
相关产品推荐
相关产品推荐

