I do have egrep (i.e. grep -E) available, and I am sure it is possible, but I spent entirely too much time trying to figure out how to one-line this. awk is also an acceptable alternative to grep.
Anybody care to turn this into a single "until" statement? Both grep queries need to exist in xrandr output, not just one or the other.
while true ; do
if xrandr | grep -q "primary 720x720 0 0" ; then
if xrandr | grep -q "connected 512x512 720 0" ; then
return
fi
fi
...
done
CodePudding user response:
grep is the wrong tool for this job. You could use awk:
if xrandr | awk '
/primary 720x720[ ]0[ ]0/ { found_a=1 }
/connected 512x512[ ]720[ ]0/ { found_b=1 }
END { if (found_a && found_b) { exit(0) } else { exit(1) } }
'; then
echo "Yes, found both strings"
else
echo "No, did not find both strings"
fi
...or you could just do your logic right in the shell:
xrandr_out=$(xrandr)
if [[ $xrandr_out = *"primary 720x720 0 0"* ]] \
&& [[ $xrandr_out = *"connected 512x512 720 0"* ]]; then
echo "Yes, found both strings"
else
echo "No, did not find both strings"
fi
Either way, the simple thing to do is to embed the logic in a function:
xrandr_all_good() {
xrandr | awk '
/primary 720x720[ ]0[ ]0/ { found_a=1 }
/connected 512x512[ ]720[ ]0/ { found_b=1 }
END { if (found_a && found_b) { exit(0) } else { exit(1) } }
'
}
until xrandr_all_good; do
: "...stuff here..."
done