将命令输出存入变量时出现‘: command not found’错误的技术求助
问题分析与修复方案
看起来你在写内存阈值监控脚本时遇到了两个典型的Shell语法问题,我来帮你一步步解决:
1. 变量var1捕获错误信息的原因及修复
你提到直接执行awk命令能得到正确数字,但存入变量后带: command not found错误,大概率是续行反斜杠的使用错误。Shell中用\续行时,反斜杠后面必须直接换行,不能有任何空格或字符——如果反斜杠后有空格,Shell会把它当成普通字符,下一行的代码会被识别成独立命令,从而抛出错误,且错误信息可能被意外捕获到变量里。
修复后的变量赋值代码:
var1=$(awk -v low=$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}') \ '{a[$1]=$2} END{print a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]-(12*low)}' /proc/meminfo)
额外优化:去掉了END块末尾的分号(在Shell的awk语法中不是必须的,避免潜在的语法歧义)。
2. if条件判断的语法错误修复
原if语句有两处明显问题:
- 方括号
[和变量之间必须有空格,]前面也必须有空格(Shell会把[var1当成一个不存在的命令); - 直接写
1*1000*1000会被Shell识别为通配符匹配,而非算术运算,需要用$(( ))包裹进行数值计算。
修复后的if-else结构:
if [ "$var1" -lt $((1000*1000)) ]; then echo "Memory exceeded" kill -9 "$var2" break else # 在这里补充你的else逻辑,例如: echo "Memory is within threshold" fi
额外优化:给var1和var2加上双引号,防止变量为空或包含特殊字符时触发语法错误。
3. 调试小技巧
如果还是不确定var1的内容是否正确,可以在赋值后加一行调试输出:
echo "Current calculated memory value: '$var1'"
这样能直观看到变量里是否还包含错误信息,快速定位问题。
内容的提问来源于stack exchange,提问作者LL18
相关产品推荐
相关产品推荐

