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

问题起因:
例如执行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中循环的时候分隔符确实参与了循环
这里写图片描述

posted @ 2022-03-06 10:40  叶常落  阅读(334)  评论(0编辑  收藏  举报