shell的命令替换和命令组合
Linux中使用反引号"``"(在波浪线的按键上)或者$()来执行命令替换。使用括号()来组合一系列命令。
[root@localhost ~]# echo what date it is? $(date +%F) what date it is? 2019-12-07 [root@localhost ~]# echo what date it is? `date +%F` what date it is? 2019-12-07
注:反引号和$()基本几乎等价,但尽量使用$()。反引号有两点不方便之处:(1)命令替换嵌套或者是包含引号的时候,反引号很麻烦,不如$()易读。(2)反引号处理反斜线的转义规则比较不明确,但是$()中的反斜线会按正常的方式转义。参见http://mywiki.wooledge.org/BashFAQ/082
使用$()可以让括号里的命令提前于整个命令运行,然后将执行结果插入在命令替换符号处。由于命令替换的结果经常交给外部命令,不应该让结果有换行的行为,所以默认将所有的换行符替换为了空格(实际上所有的空白符都被压缩成了单个空格)。
例如:
[root@localhost ~]# echo -e "a\nb" a b [root@localhost ~]# echo `echo -e "a\nb\t \tc"` a b c [root@localhost ~]#
使用双引号引用可以保留空白符。
[root@localhost ~]# echo "`echo -e "a\nb\t \tc"`" a b c
从上面大概可以知道,命令替换分为两个过程:(1)开启子shell执行其中的命令(2)将子shell中的输出结果打包插入在命令行中。但打包输出结果的过程是可以控制的(例如上面使用双引号)。
所以,如果想要将命令替换得到的多行结果保存在变量中(变量保存多行数据)。可以如下操作:
[root@localhost ~]# var="`echo -e "a b\n1 2"`" [root@localhost ~]# echo $var a b 1 2
很多时候,在命令行中需要使用"cat a.txt|command"或者执行$(cat a.txt)来传递文件a.txt中的内容,但这不是最好的方法。它们等价的效率更高的方法分别是"<a.txt"和"$(<a.txt)"。
如果使用括号将一系列命令包围,可以使得这些命令独立于当前bash环境运行。这其实是一个命令组。
例如:
[root@localhost ~]# (umask 077;touch new.txt;ls -l new.txt) -rw-------. 1 root root 0 12月 7 21:56 new.txt
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?