• 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中循环的时候分隔符确实参与了循环
    这里写图片描述

  • 相关阅读:
    081、Weave Scope 多主机监控(2019-04-29 周一)
    080、Weave Scope 容器地图(2019-04-28 周日)
    079、监控利器 sysdig (2019-04-26 周五)
    078、Docker 最常用的监控方案(2019-04-25 周四)
    077、跨主机使用Rex-Ray volume (2019-04-24 周三)
    076、创建Rex-Ray volume (2019-04-23 周二)
    075、配置Virtualbox backend(2019-04-22 周一)
    074、如何安装和配置Rex-Ray?(2019-04-19 周五)
    073、如何实现跨Docker Host 存储? (2019-04-18 周四)
    072、一文搞懂各种Docker网络 (2019-04-17 周三)
  • 原文地址:https://www.cnblogs.com/lineuman/p/15970954.html
Copyright © 2020-2023  润新知