Como simplificar o comando: quatro estruturas iguais?

1
ntpdate 110.75.186.247 >> /var/log/ntpdate.log ||  ntpdate 110.75.186.247 >> /var/log/ntpdate.log || ntpdate 203.123.48.218 >> /var/log/ntpdate.log|| ntpdate 103.16.199.21  >> /var/log/ntpdate.log

Eu tentei dois métodos, nenhum deles teve sucesso.

ntpdate 110.75.186.247  ||  ntpdate 110.75.186.247  || ntpdate 203.123.48.218 || ntpdate 103.16.199.21  >> /var/log/ntpdate.log
ntpdate 110.75.186.247  ||  ntpdate 110.75.186.247  || ntpdate 203.123.48.218 || ntpdate 103.16.199.21  &&>> /var/log/ntpdate.log

Como simplificar o comando?

    
por it_is_a_literature 27.03.2016 / 12:51

3 respostas

2

Use uma construção simples de for :

#!/bin/bash
for ip in 110.75.186.247 110.75.186.247 203.123.48.218 103.16.199.21; do
    out="$(ntpdate "$ip" 2>/dev/null)" && echo "$out" >>/var/log/ntpdate.log && break
done

Ou salvar endereços IP em uma matriz:

#!/bin/bash
ips=( 110.75.186.247 110.75.186.247 203.123.48.218 103.16.199.21 )
for ip in "${ips[@]}"; do
    out="$(ntpdate "$ip" 2>/dev/null)" && echo "$out" >>/var/log/ntpdate.log && break
done

Ainda mais simples, livre-se da variável intermediária (obrigado @kos):

#!/bin/bash
ips=( 110.75.186.247 110.75.186.247 203.123.48.218 103.16.199.21 )
for ip in "${ips[@]}"; do
    ntpdate "$ip" 2>/dev/null >>/var/log/ntpdate.log && break
done
    
por heemayl 27.03.2016 / 13:08
2
  1. Verifique se o arquivo .bash_aliases existe no seu diretório pessoal com ls -a ~/.bash_aliases (se não executar o editor de texto de sua escolha, que é no meu caso nano ~/.bash_aliases )

  2. Adicione a seguinte linha ao arquivo: alias update-time='ntpdate 110.75.186.247 >> /var/log/ntpdate.log || ntpdate 110.75.186.247 >> /var/log/ntpdate.log || ntpdate 203.123.48.218 >> /var/log/ntpdate.log || ntpdate 103.16.199.21 >> /var/log/ntpdate.log'

  3. Salve e saia do editor

  4. Agora você pode simplesmente executar o comando update-time e o resto é mágico:)

por Videonauth 27.03.2016 / 13:09
1

O problema com a construção

ntpdate 192.0.2.1 || ntpdate 203.0.113.2 >> /var/log/ntpdate.log

é que >> se aplica apenas ao último comando. Você pode endereçar isso usando um parêntese ao redor dos comandos como este:

( ntpdate 192.0.2.1 || ntpdate 203.0.113.2 ) >> /var/log/ntpdate.log

Você pode pensar que digitar ntpdate várias vezes é redundante e deve ser possível eliminá-lo. Você pode eliminar a repetição de ntpdate usando um loop. Embora no seu caso específico o comando seja tão simples, que o uso de um loop introduza mais complexidade do que elimina:

for IP in 192.0.2.1 203.0.113.2
do
    ntpdate "$IP" && break
done >> /var/log/ntpdate.log

Como alternativa, pode ser que seu problema original seja resolvido com mais facilidade invocando ntpdate apenas uma vez com vários endereços de servidor:

ntpdate 192.0.2.1 203.0.113.2 >> /var/log/ntpdate.log
    
por kasperd 27.03.2016 / 16:48