开始熟悉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

最佳答案

它是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.23172.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

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

10-13 09:22