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

如何将Bash脚本中的多条件Grep检查合并为单个until语句

如何将Bash脚本中的多条件Grep检查合并为单个until语句

嘿,这事儿好办!你想把那套嵌套的grep检查改成更简洁的单个until循环对吧?刚好你有egrep或者awk可用,咱们既能简化代码还能优化效率——毕竟原来的写法每次循环要调用两次xrandr,有点浪费资源。

最优方案:用Awk一次性检查两个条件

推荐用awk来实现,因为它可以只调用一次xrandr,同时扫描输出里的两个匹配项,效率更高。代码如下:

until xrandr | awk '
    # 标记是否找到第一个匹配项
    /primary 720x720\+0\+0/ { found1=1 }
    # 标记是否找到第二个匹配项
    /connected 512x512\+720\+0/ { found2=1 }
    # 扫描完所有行后判断:两个都找到才返回0,让until停止循环
    END { exit !(found1 && found2) }
'
do
    # 这里放你原来循环里的逻辑(比如等待、日志输出等)
    # 一定要加sleep!不然会疯狂占用CPU,建议设1秒或更长
    sleep 1
done

细节说明:

  • 转义+号:因为在正则表达式里+是特殊字符(表示前一个字符重复1次以上),所以必须用\+转义,才能准确匹配你要的720x720+0+0格式。
  • 效率优化:整个循环里只调用一次xrandr,awk会一次性扫完所有输出,记录是否找到两个目标模式,避免了重复调用外部命令的开销。
  • until的逻辑:until会反复执行do...done里的内容,直到后面的命令返回0(成功)——这里就是当两个模式都找到时,awk返回0,循环停止。

备选方案:用Grep实现(兼容你的egrep需求)

如果你更习惯用grep,也可以这么写,但建议把xrandr的输出存到变量里,避免每次循环调用两次:

until output=$(xrandr); echo "$output" | grep -qE 'primary 720x720\+0\+0' && echo "$output" | grep -qE 'connected 512x512\+720\+0'
do
    sleep 1
done

如果不在意两次调用xrandr的开销,也可以简化成:

until xrandr | grep -qE 'primary 720x720\+0\+0' && xrandr | grep -qE 'connected 512x512\+720\+0'
do
    sleep 1
done

细节说明:

  • grep -qE:-q表示静默模式(不输出匹配内容,只返回状态),-E启用扩展正则(就是你说的egrep)。
  • &&表示逻辑与:只有两个grep都返回成功(找到匹配),整个条件才成立,until停止循环。

备注:内容来源于stack exchange,提问作者fm_user8

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 14:37:27