linux - 对脚本中的这一行感到困惑

标签 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\。” |头-n 1

最佳答案

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

正则表达式

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

匹配长度为 1-3 的 4 个八位字节,由数字 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.16, 172.17, 172.18, 172.19

  • 172.20172.21172.22172.23172.29
  • 172.30, 172.31, 172.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

关于linux - 对脚本中的这一行感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41777461/

相关文章:

c# - 从 .net 程序读取 linux 中的文件?

c - Unix:在C中复制具有原始权限的文件

bash - 从另一个命令获取一些环境变量后,在远程主机上运行的 docker 容器中运行任意命令

linux - Shell 脚本,查找循环结果的平均值

sh - 如何在命令行上从 PGP key 中提取图像?

linux - 如何打印特定用户名的 CMD1、PID、PPID、USER、UID、GID,它应该采用相同的格式,我已经使用了这个命令,但它向所有用户显示

linux - 在 Bash 中使用整数执行复合 if 条件时出错

linux - 对 txt 文件进行排序,查找重复项,同时打印在其中找到的行

linux - 在shell脚本中将逗号分隔的命令行参数转换为json

linux - 通过电子邮件发送 CPU 使用率的 Shell 脚本