내용이 포함된 파일이 있습니다 ips
.
192.168.10.10 3306
192.168.10.20 3306
내 스크립트는 다음과 같습니다
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
~
출력은 다음과 같습니다
[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
echo "(3):p out loop = $p"
반환 이유 0
(첫 번째 값 $p
)! ? 마지막 값은 $p
언제였습니까 2
? 또한 16행의 오류를 어떻게 수정할 수 있나요?
답변1
쉘에서 산술 연산을 수행하는 표준 방법은 입니다 $((..))
. 표준 test
/ [
비교 및 기타 테스트만 지원합니다. 따라서 표준 호환 버전은 다음과 같습니다.
if [ "$(( p % 2 ))" -ne 0 ]; then...
(따옴표는 숫자를 포함하는 경우에만 필요하므로 IFS
일반적으로 필요하지 않습니다.)
(( .. ))
Bash/ksh/zsh에서는 명령처럼 작동하고 테스트도 허용하는 다음 구성을 사용할 수 있습니다 .
if (( p % 2 != 0 )); then ...
이 [[
테스트는 약간의 산술을 허용하는 것처럼 보이지만 구문/공백에 대해 약간 까다롭기 때문에 수행해서는 안 됩니다.
p
to에 대한 할당이 루프 외부에서 지속되지 않는 이유는 다음을 참조하세요.