bash 스크립트의 while 루프 출력

bash 스크립트의 while 루프 출력

내용이 포함된 파일이 있습니다 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 ...

[[테스트는 약간의 산술을 허용하는 것처럼 보이지만 구문/공백에 대해 약간 까다롭기 때문에 수행해서는 안 됩니다.


pto에 대한 할당이 루프 외부에서 지속되지 않는 이유는 다음을 참조하세요.

관련 정보