问题起因:
例如执行ip命令,通过grep和awk组合命令得到如下结果
eth1
eth2
tap1
tap2
需求:现在我想把每一行作为一个变量来使用,可以做到把网卡down掉,例如ifconfig eth1 down
解决方法之一:
先把标准输出赋值个一个变量,然后用for in遍历这个变量
a=$(ip link show|grep |awk)
for i in $a
do
ifconfig $i down
done
echo $a
echo "$a"
这两条的输出结果不一样,区别在于是否有换行.这是为什么呢?
这里涉及到shell的IFS内部域分隔符也就是space,tab,newline
$ echo "$IFS" | od -b
0000000 040 011 012 012
0000004
要想理解这些还得知道一个概念
引用符、名称、意义说明表
引用符 名称 意义说明
'' 单引号 称全引用或弱引用,引用所有的字符;单引号中字符除单引号本身之外都解释为字面意义,单引号不具备引用变量的功能。单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外。
"" 双引号 称部分引用或强引用,引用除美元符号($)、反引号(`)和反斜线(\)之外的所有字符。即在双引号中保持美元符号($)、反引号(`)和反斜线(\)符号的特殊含义,如"$变量名"表示以变量值替换变量名。利用双引号引用变量能够防止字符串分割,保留变量中的空格。
`` 反引符 shell把反引符中的内容解释为系统命令
\ 反斜杠 转意符,屏蔽下一个字符的特殊意义,Linux常用的特殊字符有$、*、`、+、^、&、|、"、?
实例
a=$(ip link show)
echo $a
echo "$a"
echo $IFS|od -b
echo "$IFS"|od -b
所以说这块的知识很微妙,是个大坑,而我至今仍在坑中望天而叹。
还有一个问题就是ovs-vsctl show显示网桥,有的网桥名称会有双引号,这是什么原因????
经试验发现带有特殊字母的网桥名称会被双引号括起来,真是有趣啊
ovs-vsctl list-br
列出所有ovs网桥
a=$(ovs-vsctl list-br)
for i in $a
do
ovs-vsctl del-br $i
done
其实我最想知道的是分隔符是否参与了循环,如图所示,当给$a加上双引号在for中循环的时候分隔符确实参与了循环