A ideia parece certa para mim. Usando while :; do ... , você pode torná-lo portátil para os shells normais de Bourne. As chamadas expr parecem desnecessárias. Além disso, você provavelmente desejará sair do loop quando o host for encontrado.
while :; do
if ping -c 1 $1; then
notify-send "$1 back online"
break
fi
sleep 30s
done