Sintaxe do shell
Você parece estar confuso com relação às condicionais nos scripts de shell. Todo comando shell possui um status de saída, que é um número inteiro entre 0 e 255, com 0 significando sucesso e qualquer outro valor significando falha. Declarações como if
e while
que esperam operandos booleanos inspecionam o status de saída do comando e tratam 0 (sucesso) como verdadeiro e qualquer outro valor (falha) como falso.
Por exemplo, o grep
comando retornará 0 se o padrão for encontrado e 1 se o padrão não for encontrado. assim
while ifconfig | grep "192.168.100." > /dev/null; do …
repete o loop desde que o padrão 192.168.100.
seja encontrado na saída de ifconfig
. Observe que o padrão 192.168.100.
corresponde a seqüências de caracteres como 192x168 1007
, porque .
em uma expressão regular corresponde a qualquer caractere; Para procurar uma string literal, passe a opção -F
para grep
. Para inverter a condição, coloque !
na frente.
while ! ifconfig | grep -F "192.168.100." > /dev/null; do …
Além disso, no script, você deseja comparar o valor de uma variável com um número. Você usa o -gt
operador, que faz parte da sintaxe das expressões condicionais compreendidas pelo test
comando. O test
comando retornará 0 se a expressão condicional for verdadeira e 1 se a expressão condicional for falsa.
if test "$x" -gt 200; then
É habitual usar o nome alternativo [
para o test
comando. Este nome espera que o comando para terminar com o parâmetro ]
. As duas maneiras de escrever este comando são exatamente equivalentes.
if [ "$x" -gt 200 ]; then
O Bash também oferece uma terceira maneira de escrever este comando, com a sintaxe especial [[ … ]]
. Essa sintaxe especial pode suportar mais operadores do que [
, porque [
é um comando comum sujeito às regras de análise usuais, enquanto [[ … ]]
faz parte da sintaxe do shell.
Novamente, lembre-se de que [
é para expressões condicionais , que são uma sintaxe para operadores como -n
, -gt
... [
não significa "valor booleano": qualquer comando tem um valor booleano (status de saída = 0?).
Detectando que a rede está ativa
Sua maneira de detectar que a rede está ativa não é robusta. Em particular, observe que seu script será acionado assim que qualquer interface de rede adquirir um endereço IP dentro do intervalo especificado. Em particular, é bem possível que o DNS ainda não esteja ativo nesse momento, sem falar nos compartilhamentos de rede montados.
Você realmente precisa executar esses comandos quando alguém fizer login? É mais fácil executar um comando automaticamente quando a rede é criada. A maneira de fazer isso depende da sua distribuição e se você usa o NetworkManager.
Se você precisar executar esses comandos como parte dos scripts de logon, teste o recurso que realmente precisa, não a presença de um endereço IP. Por exemplo, se você quiser testar se /net/somenode/somedir
está montado, use
while ! grep -q /net/somenode/somedir </proc/mounts; do
sleep 1
done
Se você tem iniciante ou systemd…
então você pode usá-lo. Por exemplo, com o Upstart , marque seu trabalho como start on net-device-up eth0
(substitua eth0
pelo nome da interface que fornece a conectividade de rede desejada). Com o Systemd, consulte Causar a execução de um script após o início da rede?
network-online.target
...