不确定如何正确使用变量以及如何在 bash 脚本中的 if 语句中使用它们
Not sure how to properly use variables and use them in if statements in bash scripting
我正在努力思考如何在 bash 脚本中正确声明变量以及如何在我的程序中进一步使用它们。我希望完成的是将被阻止 IP 的 IP 地址存储在变量中。我希望使用 iptables -S INPUT [行号] 来执行此操作。此外,我想检查这个 IP 地址是否与另一个 IP 地址相同,然后继续将 iptables 策略更改为接受,如果它确实是相同的地址。
我遇到的问题是我对 bash 脚本编写的经验如此之少,以至于我完全不确定为什么我的脚本不起作用或我可以更改哪些内容以使其起作用。
希望那里有经验丰富的 shell 脚本编写者可以帮助我 :)
#!/bin/bash
# Getting an IP address from a saved database
IP_ADDRESS=$(echo "${line%%,*}")
# Defining the line number for iptables -L INPUT --line-numbers while reading list
LINE_NUMBER=$(echo "$iptables_line" | cut -d " " -f1)
IPSTATUS_LINE_NUMBER=$(echo "$LINE_NUMBER")
# Wanting to store the IP address from iptables -S INPUT here to use for later
LINE_FROM_IPSTATUS=$(echo "iptables -S INPUT $IPSTATUS_LINE_NUMBER" | grep "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+") ############### Error is here
echo "IP imported from iptables -S => $LINE_FROM_IPSTATUS"
# Check if the IP address is on the iptables -S line
if [ "$LINE_FROM_IPSTATUS" = "$IP_ADDRESS" ]; then ### Potential second error here
echo "IP: $IP_ADDRESS was located on line nr. $LINE_NUMBER"
# Changing the rule in INPUT Chain to ACCEPT
iptables -R INPUT "$LINE_NUMBER" -s "$IP_ADDRESS" -j ACCEPT
else
# Echo if something went wrong
echo "Oops. Something went wrong"
fi
您的语法总体上看起来不错,但是您不需要对每个变量赋值都使用 $(echo ... )
吗?例如,这些足以分配 IP_ADDRESS 和 IPSTATUS_LINE_NUMBER,
IP_ADDRESS="${line%%,*}"
IPSTATUS_LINE_NUMBER="$LINE_NUMBER"
在发生错误的那一行,尝试在命令替换中调用 iptables
而不是 echo-ing 命令和参数,
LINE_FROM_IPSTATUS=$(iptables -S INPUT $IPSTATUS_LINE_NUMBER | grep "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+")
我正在努力思考如何在 bash 脚本中正确声明变量以及如何在我的程序中进一步使用它们。我希望完成的是将被阻止 IP 的 IP 地址存储在变量中。我希望使用 iptables -S INPUT [行号] 来执行此操作。此外,我想检查这个 IP 地址是否与另一个 IP 地址相同,然后继续将 iptables 策略更改为接受,如果它确实是相同的地址。
我遇到的问题是我对 bash 脚本编写的经验如此之少,以至于我完全不确定为什么我的脚本不起作用或我可以更改哪些内容以使其起作用。
希望那里有经验丰富的 shell 脚本编写者可以帮助我 :)
#!/bin/bash
# Getting an IP address from a saved database
IP_ADDRESS=$(echo "${line%%,*}")
# Defining the line number for iptables -L INPUT --line-numbers while reading list
LINE_NUMBER=$(echo "$iptables_line" | cut -d " " -f1)
IPSTATUS_LINE_NUMBER=$(echo "$LINE_NUMBER")
# Wanting to store the IP address from iptables -S INPUT here to use for later
LINE_FROM_IPSTATUS=$(echo "iptables -S INPUT $IPSTATUS_LINE_NUMBER" | grep "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+") ############### Error is here
echo "IP imported from iptables -S => $LINE_FROM_IPSTATUS"
# Check if the IP address is on the iptables -S line
if [ "$LINE_FROM_IPSTATUS" = "$IP_ADDRESS" ]; then ### Potential second error here
echo "IP: $IP_ADDRESS was located on line nr. $LINE_NUMBER"
# Changing the rule in INPUT Chain to ACCEPT
iptables -R INPUT "$LINE_NUMBER" -s "$IP_ADDRESS" -j ACCEPT
else
# Echo if something went wrong
echo "Oops. Something went wrong"
fi
您的语法总体上看起来不错,但是您不需要对每个变量赋值都使用 $(echo ... )
吗?例如,这些足以分配 IP_ADDRESS 和 IPSTATUS_LINE_NUMBER,
IP_ADDRESS="${line%%,*}"
IPSTATUS_LINE_NUMBER="$LINE_NUMBER"
在发生错误的那一行,尝试在命令替换中调用 iptables
而不是 echo-ing 命令和参数,
LINE_FROM_IPSTATUS=$(iptables -S INPUT $IPSTATUS_LINE_NUMBER | grep "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+")