不知道如何正确使用变量并在bash脚本的if语句中使用它们

问题描述

我正在努力地思考如何在bash脚本中正确声明变量以及如何在程序中进一步使用它们。我希望完成的工作是将被阻止IP的IP地址存储在变量中。我希望使用iptables -S INPUT [行号]来执行此操作。此外,我希望检查该IP地址是否与另一个IP地址相同,然后继续操作,如果确实是同一地址,则将iptables策略更改为ACCEPT。

我遇到的问题是,我对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,而不是回显命令和args,

LINE_FROM_IPSTATUS=$(iptables -S INPUT $IPSTATUS_LINE_NUMBER | grep "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+")