只要开始熟悉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
发布于 2017-01-21 09:19:37
它是regEx
的组合,用于检查IPv4
地址是否使用正确的语法(第一个语法)和检查有效的IP
不属于特定的范围。
The regEx
[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.20
,172.21
,172.22
,172.23
upto 172.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
发布于 2017-01-21 09:11:21
让它分解成几个部分:
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\."
这不包括192.168..,172.16.-172.19之类的IP附件。等等..。
head -n 1
此限制输出仅限于第一行。
因此,整个命令有效地尝试在您的接口上查找IP地址,而不是来自私有范围。
https://stackoverflow.com/questions/41777461
复制相似问题