我有多个服务器,并且想要设置定期检查,以便陷阱服务器具有正确的陷阱地址。 trapserver 1 为 10.10.10.1,trapserver2 为 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" ]
是一个错字。如果不是,您会立即收到错误[
。
&&
其次,和运算符之间的关系存在问题||
。在 shell 中,它们是从左到右处理的,因此您的条件不会执行您想要的操作。事实上,这个:
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 ...
请注意,您要引用变量以避免分词,请参阅什么时候需要双引号?