for 루프에 두 개의 if 조건을 만들려고 합니다. 가능합니까? 이제 두 번째에서는 아무것도 반환되지 않고 if
첫 번째에서는 두 개만 반환됩니다.OK
if
#!/bin/bash
servers=("212.39.82.157" "212.39.82.157" "1.1.1.1")
for i in "${servers[@]}"; do
ping -c 1 $i > /dev/null
if [ $? -eq 0 ]; then
echo "OK"
fi
if [ $(netstat -na | grep ':3708' | grep ESTABLISH | wc -l) -eq 2 ]; then
echo "NOT - OK"
fi
done
IP
목록의 세 번째 항목은 NOT - OK
온라인이 아니므로 반환되어야 합니다. 하지만 출력은 다음과 같습니다
root@ubuntu:~$ ./check.sh
OK
OK
root@ubuntu:~$
내가 여기서 무엇을 놓치고 있는 걸까요?
고쳐 쓰다:
#!/bin/bash
servers=("212.39.82.157" "212.39.82.157" "1.1.1.1")
for i in "${servers[@]}"; do
ping -c 1 $i > /dev/null
if [ $? -eq 0 ]; then
echo "OK"
fi
done
if [ $(netstat -na | grep ':3708' | grep ESTABLISH | wc -l) -eq 0 ]; then
echo "NOT - OK"
fi
for 루프 외부에 놓으면 확실히 작동할까요?
답변1
예를 들어 호스트, IP 주소를 파일에 입력합니다.
hosts.txt
다음 내용을 포함합니다
212.39.82.157
212.39.82.155
1.1.1.1
22.22.22.22
스크립트를 만듭니다.
#!/bin/bash
ping_hosts(){
echo
echo "*** Ping all hosts ***"
echo "--------------------------------------------"
count1=0
count2=0
start=$(date +"%d-%m-%Y-%T")
hosts=( 1.1.1.1 2.3.3.4 4.5.6.6 )
while read -r line
do
#PING=`ping -s 64 $line -c 1 | grep packet | awk '{print $(NF-2)}'`
PING=$(ping -s 64 $line -c 1 | grep packet | awk '{print $(NF-4)}')
if [[ "$PING" == "0%" ]]; then
count1=$((count1 + 1))
printf '%s\n' "$line UP"
else
count2=$((count2 + 1))
printf '%s\n\n' "$line DOWN"
fi
done < <( printf '%s\n' "${hosts[@]}")
end=$(date +"%d-%m-%Y-%T")
printf '%s\n' "Start:$start"
printf '%s\n\n' "End**:$end"
printf '%s\n' "$count1 hosts UP and $count2 hosts down"
}
ping_hosts
이제 스크립트를 실행 가능하게 만들고 실행해 보세요. 어쩌면 의도한 목적을 상실할 수도 있습니다. 그냥 공유하고 싶었어요.
답변을 업데이트하세요
#!/bin/bash
servers=("212.39.82.157" "212.39.82.157" "1.1.1.1")
for i in "${servers[@]}"; do
ping -c 1 $i > /dev/null
if [ $? -eq 0 ]; then
echo "OK"
elif [ $(netstat -na | grep ':3708' | grep ESTABLISH | wc -l) -eq 0 ]; then
echo "NOT - OK"
fi
done
참고로, 귀하의 스크립트는 bash 구문 측면에서 제대로 작성되지 않았습니다.