Shell脚本条件判断语句不生效:变量赋值为空导致逻辑运行异常
问题原因
- 核心错误是变量赋值语法不符合Shell规范:你给
X赋值的写法X= ps -aef | grep autonomy | wc -l存在两处语法问题:- 变量赋值时等号两侧不能有空格,你写的
X=后面带空格,会被Shell识别为给后续执行的ps命令设置临时环境变量,并不会把命令执行结果赋值给X - 要捕获命令的执行结果赋值给变量,必须用
$()包裹整段命令,也就是Shell的命令替换语法
- 变量赋值时等号两侧不能有空格,你写的
- 潜在问题:用
ps + grep统计进程数时,grep自身的进程也会被统计进结果,会多计数1次,建议加grep -v grep过滤掉grep自身进程 - 可选优化:数值大小判断可以用
(( ))算术判断语法,写法更简洁,不需要额外加引号和-lt这类字符比较符
修正后完整代码
#! /bin/bash Y=1 cd /path/to/run/command/ # 正确捕获进程计数结果赋值给X X=$(ps -aef | grep autonomy | grep -v grep | wc -l) z=$X if [[ "${z}" -lt "${Y}" ]]; then echo "$z" echo "if is working" mail -s "Warning: Process count low" xyz@gmail.com <<< "services has been restarted." source /path/to/run/restartservices.sh sleep 20 else echo "else is working" sleep 20 fi
验证方法
你可以在X赋值完成后添加一行echo "进程计数结果为: $X",执行脚本即可看到X已经正常获取到进程数值,后续z变量也能正常拿到值,条件判断会按照预期逻辑执行。
内容的提问来源于stack exchange,提问作者Vaibhav Borse
相关产品推荐
相关产品推荐

