Which of the following commands should be used in a bash script that needs a variable containing the IP address fo the eth0 interface?
The output for the command ifconfig eth0 is shown below:
eth0 Link encap:Ethernet HWaddr 00:0C:29:B0:6C:E1
inet addr:10.32.176.236 Bcast:10.32.176.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:feb0:6ce1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4583 errors:0 dropped:0 overruns:0 frame:0
TX packets:1140 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:595654 (581.6 KiB) TX bytes:174578 (170.4 KiB)
A. IP=LANG= ifconfig eth0 | awk '{print $2}' | cut -f2
B. IP=$(LANG= ifconfig eth0 | grep inet | cut -d: -f2)
C. IP=`LANG= ifconfig eth0 | awk '{print $3}'`
D. IP=`LANG= ifconfig eth0 | grep inet | cut -d: -f2 | awk {print $1}`
E. IP=$(ifconfig eth0 | grep inet | awk '{print $2}' | cut -d: -f2)
目的是取得 第2行中的IP 10.32.176.236
因为ifconfig eth0 的结果中有1行以上的描述,所以为了只取得第二行的IP,行列都需要限制。
A. IP=LANG= ifconfig eth0 | awk '{print $2}' | cut -f2
IP=LANG= xxxx ,这种写法并不会把运算结果传给IP,或者 IP=LANG
shell变量的基本赋值方式是 <变量>=<文字列>
显示一下
[root@vanilla ~]# set | grep ^IP
[root@vanilla ~]#
B. IP=$(LANG= ifconfig eth0 | grep inet | cut -d: -f2)
IP=$xxx 的含义是, 但是如果xxx不是名字,而是表达式的话,根据表达式运算结果的不同,IP的值有两种情况。
假如表达式的运算结果不是一个字符串,而是包含空格,tab等,则IP的值为 $'表达式值,换行符等会成为转义字符'
假如表达式的运算结果是一个字符串,就是说不包含空格,tab等,则IP的值为 表达式值
我们再分析 LANG= ifconfig eth0 | grep inet | cut -d: -f2 的运算过程
先使用grep 对行限定,结果为第二行。
在使用cut 对列限定,分隔符为冒号,取第二个字段。也就是第一个分号到第二个分号的内容。结果中部单纯是IP地址,还包含 Bcast。
所以B也不正确。
C. IP=`LANG= ifconfig eth0 | awk '{print $3}'`
` 号 在这里与$的用法相同,
假如表达式的运算结果不是一个字符串,而是包含空格,tab等,则IP的值为 $'表达式值,换行符等会成为转义字符'
假如表达式的运算结果是一个字符串,就是说不包含空格,tab等,则IP的值为 表达式值
很明显没有对 行限制,只是用awk 对列进行了限制。
D. IP=`LANG= ifconfig eth0 | grep inet | cut -d: -f2 | awk {print $1}`
awk语法错误。
awk: cmd. line:1: {print
awk: cmd. line:1: ^ unexpected newline or end of string
awk运算时,没有加引号的 {print $1} 表达式被当作参数了。
和尚用的linux 版本(CentOS 2.6.18-8.el5xen )中,awk的表达式单双引号都可以使用。
Examples:
gawk '{ sum += $1 }; END { print sum }' file
gawk -F: '{ print $1 }' /etc/passwd
E. IP=$(ifconfig eth0 | grep inet | awk '{print $2}' | cut -d: -f2)
因为ifconfig eth0 的结果中有1行以上的描述,所以为了只取得第二行的IP,行列都需要限制。
例子中先使用了grep 进行行限定,只取得包含 inet 的行,
结果为
inet addr:10.32.176.236 Bcast:10.32.176.255 Mask:255.255.255.0
又使用awk的列限制,取得第二列。注意如果不指定awk 的分割参数,默认是以空格分隔字段的。连续的空格被认为是一个空格。
结果为
addr:10.32.176.236
最后 cut -d: -f2 是在awk运算结果的基础上再次取得第二个字段。注意不指定分隔符的话,默认是tab。
结果为IP地址。
公布答案【1+1=2,嘿嘿】