Una simplificación adicional de la respuesta de Martynas:
until ping -c1 www.google.com >/dev/null 2>&1; do :; done
tenga en cuenta que el ping en sí se usa como prueba de bucle; Tan pronto como tiene éxito, el ciclo termina. El cuerpo del bucle está vacío, con el comando nulo " :
" utilizado para evitar un error de sintaxis.
Actualización: pensé en una forma de hacer que Control-C salga limpiamente del bucle de ping. Esto ejecutará el bucle en segundo plano, atrapará la señal de interrupción (Control-C) y matará el bucle de fondo si ocurre:
ping_cancelled=false # Keep track of whether the loop was cancelled, or succeeded
until ping -c1 "$1" >/dev/null 2>&1; do :; done & # The "&" backgrounds it
trap "kill $!; ping_cancelled=true" SIGINT
wait $! # Wait for the loop to exit, one way or another
trap - SIGINT # Remove the trap, now we're done with it
echo "Done pinging, cancelled=$ping_cancelled"
Es un poco tortuoso, pero si quieres que el bucle sea cancelable, debería ser suficiente.