zoukankan      html  css  js  c++  java
  • shell的命令替换和命令组合

    bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html


    Linux中使用反引号"``"(在波浪线的按键上)或者$()来执行命令替换。使用括号()来组合一系列命令。

    [root@xuexi ~]# echo what date it is? $(date +%F)
    what date it is? 2016-09-25
    
    [root@xuexi tmp]# echo what date it is? `date +%F`  # 或者使用反引号

    注:反引号和$()基本几乎等价,但尽量使用$()。反引号有两点不方便之处:(1)命令替换嵌套或者是包含引号的时候,反引号很麻烦,不如$()易读。(2)反引号处理反斜线的转义规则比较不明确,但是$()中的反斜线会按正常的方式转义。参见http://mywiki.wooledge.org/BashFAQ/082

    使用$()可以让括号里的命令提前于整个命令运行,然后将执行结果插入在命令替换符号处。由于命令替换的结果经常交给外部命令,不应该让结果有换行的行为,所以默认将所有的换行符替换为了空格(实际上所有的空白符都被压缩成了单个空格)。

    例如:

    [root@xuexi ~]# echo -e "a
    b"
    a
    b
    [root@xuexi ~]# echo `echo -e "a
    b	   	c"`
    a b c

    使用双引号引用可以保留空白符。

    [root@xuexi ~]# echo "`echo -e "a
    b	   	c"`"
    a
    b               c

    从上面大概可以知道,命令替换分为两个过程:(1)开启子shell执行其中的命令(2)将子shell中的输出结果打包插入在命令行中。但打包输出结果的过程是可以控制的(例如上面使用双引号)。

    所以,如果想要将命令替换得到的多行结果保存在变量中(变量保存多行数据)。可以如下操作:

    var="`echo -e "a b
    1 2"`"   # 命令替换加双引号保护
    echo "$var"   # 变量引用也加双引号保护

    很多时候,在命令行中需要使用"cat a.txt|command"或者执行$(cat a.txt)来传递文件a.txt中的内容,但这不是最好的方法。它们等价的效率更高的方法分别是"<a.txt"和"$(<a.txt)"。

    如果使用括号将一系列命令包围,可以使得这些命令独立于当前bash环境运行。这其实是一个命令组。

    例如:

    [root@xuexi ~]# (umask 077;touch new.txt;ls -l new.txt)
    -rw------- 1 root root 0 Aug 13 22:46 new.txt
  • 相关阅读:
    服务端集成支付宝踩过的坑RSA、RSA2
    javascript预览图片——IT轮子系列(九)
    winform 写App.config配置文件——IT轮子系列(八)
    登录-添加页面
    登录-Login页面
    登录-控制器
    登录-控制器验证
    登录-dal
    登录-数据库模型
    登录-存储过程
  • 原文地址:https://www.cnblogs.com/f-ck-need-u/p/7401591.html
Copyright © 2011-2022 走看看