Tenho ips
arquivo com conteúdo:
192.168.10.10 3306
192.168.10.20 3306
e meu roteiro é:
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 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"
retornar 0
(primeiro valor $p
)!? quando o último valor $p
é 2
? também, como corrigir o erro na linha 16?
A maneira padrão de fazer aritmética no shell é
$((..))
. Padrãotest
/[
suporta apenas comparações e outros testes. Assim, a versão em conformidade com o padrão seria:(Isso só precisa das aspas se o seu
IFS
contiver dígitos, então geralmente eles não são necessários.)Em Bash/ksh/zsh, você poderia usar a
(( .. ))
construção, que funciona como um comando e permite o teste também: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 ao motivo pelo qual a atribuição a
p
não persiste fora do loop, consulte