破译unix语句

破译unix语句

我来解读一下这里所说的内容:

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 循环只是为了显示结果以及访问它们的一种方法。

相关内容