output while loop no script bash

0

Eu tenho o arquivo ips com o conteúdo:

192.168.10.10 3306
192.168.10.20 3306

e meu script é:

1 #!/bin/bash
  2
  3 p=0
  4 cat /root/ips | while read host port
  5  do
  6    check_up=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
  7     if [ $check_up != 0 ]
  8         then
  9           p=$[$p+1]
 10           echo "(1):p in loop = $p"
 11     fi
 12         echo "(2):p in loop = $p"
 13  done
 14      echo "(3):p out loop = $p"
 15
 16     if [ $p % 2 != 0 ]
 17        then
 18             exit 1
 19      fi
~

e a saída é:

[root@db1 ~]# ./new-script.sh
(1):p in loop = 1
(2):p in loop = 1
(1):p in loop = 2
(2):p in loop = 2
(3):p out loop = 0
./new-script.sh: line 16: [: too many arguments

por que echo "(3):p out loop = $p" return 0 (primeiro valor $p ) !? quando o último valor $p é 2 ? também, como consertar o erro na linha 16?

    
por pyramid13 06.03.2018 / 16:46

1 resposta

2

A maneira padrão de fazer aritmética no shell é $((..)) . O padrão test / [ suporta apenas comparações e outros testes. Então, a versão em conformidade com o padrão seria:

if [ "$(( p % 2 ))" -ne 0 ]; then...

(Isso só precisa das aspas se o seu IFS contiver dígitos, então normalmente eles não são necessários.)

No Bash / ksh / zsh, você pode usar a construção (( .. )) , que funciona como um comando e permite o teste também:

if (( p % 2 != 0 )); then ...

O teste [[ parece permitir alguma aritmética, mas é um pouco exigente quanto à sintaxe / espaço em branco, então você provavelmente não deveria fazer isso.

Quanto à razão pela qual a atribuição a p não persiste fora do loop, consulte

por 06.03.2018 / 16:54