如何将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
相关产品推荐
相关产品推荐

