You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将命令输出存入变量时出现‘: 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:59:43