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

为何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错误,根源有两个:

错误点分析

  1. 变量大小写不匹配:你定义的变量是SCRN,但判断时误用了$screen(Shell变量严格区分大小写),导致$screen为空值,使得判断式变成[ -eq 1 ],缺少左侧操作数
  2. 变量未加引号:即使变量名正确,若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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:48:13