为何grep与screen配合无法正常工作?Shell脚本故障排查求助
修复你的Screen会话检测Shell脚本
咱们一步步拆解你两个脚本的问题,然后给出可行的修正方案:
第一个脚本的问题与修复
你的第一段脚本写法存在语法错误:[[ ]]是Shell的条件测试结构,但它无法直接容纳管道命令。而且我们判断会话是否存在时,不需要grep的输出,只需要它的退出状态码(找到匹配返回0,未找到返回非0)。
修正后的第一个脚本
#!/bin/bash SERVER="test_start.sh" SCRN="testMinecraft" # 使用grep -q静默模式,仅返回状态码,不输出内容 if ! screen -ls | grep -q "$SCRN"; then /root/testser/"$SERVER" fi
关键修改点:
- 移除了错误的
[[ ]]包裹,直接用命令的退出状态作为if的判断条件 - 添加
grep -q选项,避免多余的输出干扰 - 给变量
$SCRN和$SERVER加上双引号,防止变量包含空格或特殊字符时出现异常 - 修正了变量名拼写(你原来写的
SERWER是笔误,若实际文件名就是这个可改回)
第二个脚本的报错原因与修复
你遇到的[: -eq: unary operator expected错误,根源有两个:
错误点分析
- 变量大小写不匹配:你定义的变量是
SCRN,但判断时误用了$screen(Shell变量严格区分大小写),导致$screen为空值,使得判断式变成[ -eq 1 ],缺少左侧操作数 - 变量未加引号:即使变量名正确,若
SCRN为空(比如未找到匹配会话),[ $SCRN -eq 1 ]也会变成[ -eq 1 ],触发同样的错误
修正后的第二个脚本
#!/bin/bash SERVER="test_start.sh" # 用$(...)替代反引号,更现代的命令替换写法 SCRN=$(screen -ls | grep "testowyscreen" | wc -l) # 给变量加双引号,确保空值时判断式仍合法 if ! [ "$SCRN" -eq 1 ]; then echo "there is nothing" /root/testser/"$SERVER" fi
更优的替代方案
其实用wc -l计数的方式不够严谨(比如多个匹配会话时计数大于1),更直接的方式还是用grep -q判断会话是否存在:
#!/bin/bash SERVER="test_start.sh" SCRN_NAME="testowyscreen" if ! screen -ls | grep -q "$SCRN_NAME"; then echo "there is nothing" /root/testser/"$SERVER" fi
内容的提问来源于stack exchange,提问作者Szopel
相关产品推荐
相关产品推荐

