我来解读一下这里所说的内容:
export IP=`/sbin/ifconfig | grep 'inet addr:'|grep -v '127.0.0.1'|
cut -d: -f2 | awk '{print $1}'`
我知道是将IP设置为环境变量,但是除此之外,其他的是什么意思呢?
答案1
它将列出系统上的所有非环回 IP 地址。假设此机器上只有一个非环回 IP 地址,它将把系统的 IP 地址导出到环境变量“IP”中。
首先一次运行管道一个“部分”。意思是,第一次运行
/sbin/ifconfig
看看它做了什么。然后跑...
/sbin/ifconfig | grep 'inet addr:'
并从那里继续前进。
答案2
有很多事情发生。第一的:
export IP=`...`
意味着在反引号(不是单引号,请小心)之间运行命令并将其输出用作名为“IP”的变量的值。 “export”意味着任何子进程都将继承名为“IP”的变量及其值。
该命令是一个管道,每个命令的标准输出都输入到下一个命令的标准输入中。/sbin/ifconfig
生成有关网络接口的信息列表。 ifconfig 的所有输出行都输入到grep 'inet addr:'
. Grep 只是传递至少部分匹配第一个参数的文本行,这种模式称为正则表达式。
该命令grep -v '127.0.0.1'
仅传递不匹配的文本行。 127.0.0.1 是“环回”IP 地址。众所周知,我们不希望它进入名为“IP”的变量的值。
该命令cut -d: -f2
打印其输入中每行的第二个字段。字段由“:”(分号)分隔。该awk '{print $1}'
命令仅打印第一个空格分隔的列。
正如 TheDude 所写,它将所有非环回 IP 地址作为字符串放入 shell 环境变量 IP 的值中。
答案3
请注意:由于 ifconfig 通常会显示多个连接(除了环回连接之外),因此此代码会创建一个字符串变量,其中每个 IP 地址与下一个 IP 地址之间用换行符分隔。我的看起来像这样:
bigbird@sananda:~/pq$ export IP=`/sbin/ifconfig | grep 'inet addr:'|\
grep -v '127.0.0.1'| cut -d: -f2 | awk '{print $1}'`
bigbird@sananda:~/pq$ echo "[${IP}]"
[192.168.126.1
192.168.114.1
192.168.1.2]
bigbird@sananda:~/pq$
要实际使用它,它可能需要进一步解析(在换行符上分割字符串)。
处理此问题的一种方法是将 IP 地址字符串放入数组元素中:
export IP=($(/sbin/ifconfig | grep 'inet addr:'|grep -v '127.0.0.1'| cut -d: -f2 |\
awk '{printf "%s ", $1}'))
for (( I=0; I<${#IP[@]}; I++ ))
do
echo "${I} [${IP[${I}]}]"
done
bigbird@sananda:~/bin$ mytest
0 [192.168.126.1]
1 [192.168.114.1]
2 [192.168.1.2]
bigbird@sananda:~/bin$
添加的括号 () 将输出转换为数组元素。 print 已更改为 printf,以在每个 IP 后添加一个空格(默认的 bash 分隔符)并消除换行符。反引号符号:
`...`
用于将命令的输出转换为字符串的方法也已替换为更新的语法 $(...) 。
包含 for 循环只是为了显示结果以及访问它们的一种方法。