Você pode envolver seus dois comandos críticos em um loop:
max_retries=3
for i in $(seq ${max_retries});do
critical_command
if [ $? == 0 ];then
break
fi
done
$? armazena o código de retorno do último comando. "0" significa sucesso, qualquer outra coisa significa falha. Entre os colchetes, eu comparo esse código de retorno com "0". Se eles forem iguais, a comparação renderá "true", o que significa que entramos no bloco "if" (se você usar isso, preste atenção nos espaços em branco ao redor dos colchetes, eles são importantes ). Lá eu emito um único "break", que diz ao loop for que ele deveria terminar imediatamente, e não fazer mais iterações. Resumindo: se o critical_command foi bem sucedido, continue com o resto do programa.
Isso também funciona se a saída do seu comando for capturada em uma variável, como no seu video_link. Para a ferramenta de upload, pode ser aconselhável adicionar uma pequena pausa antes de tentar novamente, pois o servidor pode estar ocupado:
critical_command
sleep 10 # wait for 10 seconds
Eu envolveria cada comando separadamente, mesmo que não seja a solução mais elegante (você poderia criar uma função wrapper, que tenta novamente o comando dado como um argumento - não tenho certeza se isso funciona no bash).