我正在尝试运行一个在grep状态下失败的Shell脚本,下面是我正在运行的
activeIP=`grep -Po '(?<=active.server.ip=).*' /etc/active.properties`
command="ifconfig | grep "$activeIP
eval "$command"
if [ $? == 0 ]; then
echo"You are on Active"
else
echo"You are not on Active"
fi
active.server.ip=10.25.15.1
standby.server.ip=10.25.15.2
请帮助......
答案 0 :(得分:0)
我会使用不同的工具来解析文件,而且我也避免使用eval
,因为它很容易出错。因此,使用awk
并假设您正在使用bash
我会这样做:
activeIP=$(awk -F= '$1 == "active.server.ip" {print $2}' /etc/active.properties)
if ip addr show | grep -qw "$activeIP"; then
echo "You are on Active"
else
echo "You are not on Active"
fi
首先,我们使用awk
和-F=
分割=
上的字段。然后,如果第一个字段等于active.server.ip
,我们将打印第二个字段。注意,如果您在=
周围有/允许空格,则需要稍微更改一下。我们将此打印值存储在activeIP
中,就像您尝试一样。
接下来,我们检查给定的IP是否显示在当前的IP列表中。 ip
命令是ifconfig
的较新版本,因此我换了它。没有必要构建一个字符串eval
,因为bash在执行命令时已经进行了变量替换。
我们将grep
用于检查ip addr show
命令的输出,我们添加-w
以匹配单词,因此如果我们的IP是另一个IP的子字符串它不会匹配(例如,字符串192.168.114.3
将与IP 192.168.114.37
不匹配)。此外,由于我们实际上并不关心匹配的行,因此我添加了-q
以使其安静运行。
最后,if
会查看退出状态,因此我们不必对$?
进行明确的测试。
作为另一个可能的步骤减少,我们实际上可以跳过将IP存储在变量中,让bash
像我们一样为我们处理替换:
if ip addr show | grep -qw $(awk -F= '$1 == "active.server.ip" {print $2}' /etc/active.properties); then
echo "You are on Active"
else
echo "You are not on Active"
fi
所以它会在awk
&#34;行#34;原样。