여러 개의 서버가 있고 트랩 서버가 올바른 트랩 주소를 갖도록 정기적인 검사를 설정하고 싶습니다. 트랩 서버 1은 10.10.10.1이고 트랩 서버 2는 10.10.10.2입니다. 그러나 아래 스크립트에서는 10.10.10.x의 $trapaddress 값이 "10.10.10.x"와 같은지 확인하지 못합니까?
내가 어디서 잘못됐는지 모르시나요?
매우 감사합니다
#!/bin/bash
for LINE in $( cat /home/username/serverslist.txt )
do
SERVER=`(echo $LINE | awk -F : '{ print $1 }')`
echo " "
echo $SERVER
traphost=$( ssh $SERVER -t sudo cat /etc/traphost.txt )
trapaddress=$( ssh $SERVER -t sudo cat /etc/trapaddress.txt )
echo -e " Traphost is $traphost \n Trapaddress is $trapaddress"
if [ $traphost = "trapserver1" ] && [ $trapaddress= "10.10.10.1" ] || [ $traphost = "trapserver2" ] && [ $trapaddress= "10.10.10.2" ] ;
then
echo "server is happy."
else
echo " $servername server has incorrect $trapaddress ."
fi
done
답변1
=
첫째, in 전의 공간이 부족한 것은 [ $trapaddress= "10.10.10.1" ]
오타라고 생각합니다. 그렇지 않으면 즉시 오류가 발생합니다 [
.
&&
둘째, 와 연산자 사이의 관계에 문제가 있습니다 ||
. 셸에서는 왼쪽에서 오른쪽으로 처리되므로 조건이 원하는 대로 작동하지 않습니다. 실제로 이는 다음과 같습니다.
if cond1 && cond2 || cond3 && cond4; then ...
비슷한 내용 더 보기:
if ((cond1 && cond2) || cond3) && cond4; then ...
특히,조건 4그건 진실이야. 당신이 원하는 것은
if ( ... && ...) || ( ... && ... ); then ...
또는
if [[ ... && ... || ... && ... ]]; then ...
( [[ .. ]]
그 안에하다일반적인 상대적 우선순위를 갖습니다. )
필요한 경우 슬래시가 포함되어 있지 않다고 가정하고 변수를 연결하여 더 쉽게 비교할 수 있습니다.
if [[ "$traphost/$trapaddress" = "trapserver1/10.10.10.1" ||
"$traphost/$trapaddress" = "trapserver2/10.10.10.2" ]]; then ...
단어 분리를 피하기 위해 변수를 인용하고 싶습니다.언제 큰따옴표가 필요합니까?