Shell脚本报错[: -lt: unary operator expected问题求助
问题分析与修复方案
你遇到的这个错误,核心原因是变量var的赋值语法完全错误,导致var没有被正确赋值,最终在if条件判断时出现操作符缺少操作数的报错。下面一步步拆解问题和修复:
1. 变量赋值的语法错误
你的脚本里这一行:
var= grep -o -i abcd /home/test1.txt | wc -l
这是典型的Shell语法错误——给变量赋值时,=两边不能有空格,而且要捕获命令输出的话,必须用命令替换的语法:要么用$(command)(推荐的现代写法),要么用反引号`command`。
正确的写法应该是:
var=$(grep -o -i abcd /home/test1.txt | wc -l)
或者旧风格的反引号写法:
var=`grep -o -i abcd /home/test1.txt | wc -l`
如果不这么写,Shell会把var=当成临时环境变量设置,然后单独执行后面的grep命令,var本身根本不会被赋值。后续if [ $var -lt $threshold ]中,$var是空字符串,条件就变成了[ -lt 15 ]——-lt是二元操作符,需要左右两个操作数,现在左边为空,Shell误以为你要用一元操作符(比如-z判断空),于是触发"unary operator expected"错误。
2. 额外的潜在问题与优化
除了赋值语法,还有两个需要注意的点:
- 你注释掉了
ps -aux | grep abcd > /home/test1.txt这一行,如果/home/test1.txt不存在或者是空文件,grep的结果为空,wc -l会返回0,虽然语法上没问题,但会导致服务状态判断不准确,建议取消这行的注释,确保文件有内容。 - 在
if条件中,最好给变量加上双引号,避免变量为空时再次出现语法错误(即使修复了赋值,万一var为空,[ "$var" -lt "$threshold" ]也能正常执行)。比如:
这样脚本会更健壮。if [ "$var" -lt "$threshold" ]; then
修复后的完整脚本
#!/bin/bash # 取消注释,确保test1.txt包含需要检测的内容 ps -aux | grep abcd > /home/test1.txt var=$(grep -o -i abcd /home/test1.txt | wc -l) threshold=15 if [ "$var" -lt "$threshold" ]; then echo "One of the service is down on $HOSTNAME" >mail.txt mailx -s "Application alert on $HOSTNAME" myname@domain.com <mail.txt fi if [ "$var" -eq "$threshold" ]; then echo "All services are up and running fine on $HOSTNAME" >mail.txt mailx -s "Application alert on $HOSTNAME" myname@domain.com <mail.txt fi exit;
内容的提问来源于stack exchange,提问作者rb16




