您的位置:首页 > 运维架构 > Linux

linux把标准输出赋值给变量遇到的问题

2016-08-24 19:45 190 查看
问题起因:

例如执行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中循环的时候分隔符确实参与了循环

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell 分隔符