在脚本中对这一行感到困惑

时间:2017-01-21 08:59:11

标签: linux shell sh

刚开始熟悉linux,对脚本中的这一行感到困惑

get_ip(){
    local IP=$( ip addr | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | egrep -v "^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\." | head -n 1 )
    [ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipv4.icanhazip.com )
    [ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipinfo.io/ip )
    [ ! -z ${IP} ] && echo ${IP} || echo
}

我猜这应该是我的IP地址?

你们可以向我详细解释一下吗?

这一行ip addr | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | egrep -v "^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\." | head -n 1

2 个答案:

答案 0 :(得分:2)

它是regEx的组合,用于检查IPv4地址是否使用正确的语法(第一个),并检查有效IP是否属于特定范围。

regEx

  

[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

匹配4个八位字节,其长度可以由1-3组成,由0-9组成,由.分隔。这可确保从处理中过滤掉任何IP地址。

第二个带有-v标志的反转匹配,即意味着排除这种类型的那个,

  

^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\.

开始排除IPs
  • 192.168

  • 172.16172.17172.18172.19

  • 172.20172.21172.22172.23高达172.29
  • 172.30172.31172.32
  • 10.
  • 127.

  • 255.

  • 0.

head -n 1在这里无关紧要,因为上述命令仅在整行上单行操作。

至于脚本的其余部分

# This line checks if variable containing the IP address is empty and if it is
# empty i.e. the condition `[ -z ${IP} ] ` turned out to be true set the IP
# address to the value obtained from `wget` output
[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipv4.icanhazip.com )

# same as above
[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipinfo.io/ip )

# with a '!' symbol it means the variable is not empty just print value
# to stdout or (||) print just an empty output (just echo)
[ ! -z ${IP} ] && echo ${IP} || echo

答案 1 :(得分:1)

让我们把它拆分成段:

ip addr - 显示有关您的界面的信息

egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

  

-o, - 仅匹配                 仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。

这会尝试匹配ip addr

输出中的IP地址

egrep -v "^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\."

这不包括IP地址,如192.168。,172.16。 -172.19。等......

head -n 1 这会将输出限制为仅第一行

因此整个命令有效地尝试在您的接口上找到不属于私有范围的IP地址。