Shell 反引号、$() 和 ${} 的区别
1.反引号与 $() 用于命令替换
反引号和$()
的作用相同,用于命令替换(command substitution),即完成引用命令的执行,将其结果替换出来,与变量替换差不多。比如:
echo `date '--date=1 hour ago' +%Y-%m-%d-%H`
#或者
echo $(date '--date=1 hour ago' +%Y-%m-%d-%H)
输出结果是相同的:2019-02-02-09。
在编写 Shell 脚本时建议使用$()
,原因主要有:
(1)反引号与单引号外形相似,容易混淆;
(2)在多层次的复合替换中,里层的反引号需要转义处理(\`) ,而$()则比较直观。例如下面的命令格式是错的:
command1 `command2 `command3``
原本的意图是要在`command2 `command3` `中先将 command3 替换出来给 command2 处理,然后再将结果传给 command1 处理。然而,真正的结果在命令行中却分成了`command2`与` `两段。正确的输入应该如下:
command1 `command2 \`command3\``
#或者换成 $()
command1 $(command2 $(command3))
(3)反引号中对于反斜杠有特殊的处理,使用反协议对 Shell 特殊字符进行转义时需要两个反斜杠,而$()
中只需要使用一个反斜杠。比如下面的脚本,需要输出字符串$HOME
,而不是环境变量 HOME 的内容,在反引号中需要对$
符使用双反斜杠进行转义,$()
中只需要使用一个反斜杠。
var1=`echo \$HOME` #使用一个反斜杠无法完成对$符的转义
var2=`echo \\$HOME`
var3=$(echo \$HOME)
echo $var1
echo $var2
echo $var3
脚本执行结果:
/root
$HOME
$HOME
综上所述, 反引号是一个老的用法,$()
是新的用法,无论是在学习还是实际工作中,建议使用$()
。
2.${} 用于变量替换
2.1 直接变量替换
一般情况下,$var
与${var}
并没有区别,但是用${ }会比较精确的界定变量名称的范围,比方说:
A="dablelv"
echo $AB
原本是打算先将$A
的结果替换出来,然后再补一个B字母于其后,但在命令行上,真正的结果却是只会替换变量名称为AB的值出来。若使用${}
就没问题了。
echo ${A}B
2.2 特殊变量替换
${}
除了直接替换变量内容,还有一些用于字符串变量的特殊功能。假设我们定义了一个字符串变量为:
file="/dir1/dir2/dir3/my.file.txt"
2.2.1 ${:}
与${::}
用于字符串提取
字符串提取可以使用${:}
与${::}
。
(1)${var:n}
若 n 为正数,n 从 0 开始,表示在变量 var 中提取第 n 个字符到末尾的所有字符。若 n 为负数,提取字符串最后面 n 的绝对值个字符,使用时在冒号后面加空格或一个算术表达式或整个 num 加上括号,如${var: -2}
、${var:1−3}
或 ${var:(-2)}
均表示提取最后两个字符。
${file:1}:提取第 1 个字符及其后面的所有字符:dir1//dir2/dir3/my.file.txt
${file: -3}:提取最后 3 个字符,注意冒号后面添加一个空格:txt
${file:1-4}:提取最后 3 个字符,冒号后面不需要添加空格:txt
${file:(-3)}:提取最后 3 个字符,冒号后面不需要添加空格:txt
(2)${var:n1:n2}
${var:n1:n2}
用于提取从下标 n1 开始后面 n2 个字符,其中下标 n1 与 n2 从 0 开始。
${file:0:5}:提取最左边的 5 个字符:/dir1
${file:5:5}:提取从第 5 个字符开始右边的连续 5 个字符:/dir2
2.2.2 ${/}
与${//}
用于字符串模式匹配替换
${var/pattern/pattern}
表示将 var 字符串第一个匹配的 pattern 替换为另一个 pattern。不改变原变量。
${file/dir/path}:将第一个 dir 替换为 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部 dir 替换为 path:/path1/path2/path3/my.file.txt
2.2.3${#}
、${##}
、${%}
与${%%}
用于字符串模式匹配截断
可以过滤掉符合指定规则的字符串,不改变原变量。
${file#*/}:拿掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最后一个 / 及其左边的字符串:my.file.txt
${file#*.}:拿掉第一个 . 及其左边的字符串:file.txt
${file##*.}:拿掉最后一个 . 及其左边的字符串:txt
${file%/*}:拿掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:拿掉第一个 / 及其右边的字符串:(空值)
${file%.*}:拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
# 去掉左边,在键盘上 # 在 $ 左边)
% 去掉右边(在鉴盘上 % 在 $ 右边)
一个符号是最小匹配,两个符号是最大匹配
关于变量替换符${}
其它的特殊用法,这里不详细展开,具体可以参考Shell特殊字符大全。
参考文献
[1] Shell 特殊字符大全
Shell 反引号、$() 和 ${} 的区别相关推荐
- html代码中本地路径里斜杠 / 和反斜杠 \ 的区别
总结: windows和unix,linux本地路径里的 / 和 \ 在html代码里:错误文件路径: windows 只使用一个 \ 是不识别的, src='D:\个人\图片\2.jpg' unix ...
- 反引号包裹反引号_五个金色反引号
反引号包裹反引号 五种琴弦 从Java 1.0开始,我们就有了字符串文字"like this" . 我们还想要其他什么字符串? 其他编程语言为我们提供: 表达式插值: s" ...
- linux目录下有斜杠,Windows和Linux路径中斜杠/和反斜杠\ 的区别
Unix使用斜杆/ 作为路径分隔符,而web应用最新使用在Unix系统上面,所以目前所有的网络地址都采用 斜杆/ 作为分隔符. Windows由于使用 斜杆/ 作为DOS命令提示符的参数标志了,为了不 ...
- 正反斜杠的区别_电脑中的正斜杠(/)与反斜杠(\)的区别
计算机中的正斜杠(/)与反斜杠(\)的区别 正斜杠,符号是"/";反斜杠,符号是"\". 一直很不解正斜杠与反斜杠到底有何区别?经过一段时间的理解,得出 DOS ...
- 数字的原码,补码,反码,~和‘-’的区别。取反与负号的区别。
一.原码,反码,补码的基础概念和计算方法. 原码,反码,补码只是计算机存储数字的一种方式. 1,原码 原码就是用第一位表示符号位,其余位表示值,比如8位的二进制数 [+1]原 = 0000 0001 ...
- 【总结】斜杠/和反斜杠\ 的区别
路径中 斜杠/和反斜杠\ 的区别 前言 总结 前言 本章主要总结:路径中 斜杠与反斜杠的区别. 路径中使用斜杠/和反斜杠\的区别到底是什么. 1.正斜杠,又称左斜杠,符号是"/": ...
- 路径中 斜杠/和反斜杠\ 的区别
路径中使用斜杠/和反斜杠\的区别到底是什么. 1.正斜杠,又称左斜杠,符号是"/":反斜杠,也称右斜杠,符号是"\". 2.在Unix/Linux中,路径的分隔 ...
- 正斜杠(/)和反斜杠(\)的区别
正斜杠(/)和反斜杠(\)的区别 正斜杠,符号是"/"; 反斜杠,符号是"\". 正斜杠/表示除法,分割. 在unix系统中,正斜杠/表示目录.由于web遵循u ...
- 【Shell系列】$(shell pwd)和$(pwd)用法区别
Date: 2019-5-8 1.参考 $(shell pwd)和$(pwd)有什么区别 shell 基础 $(cd `dirname $0`;pwd) Linux常用命令简述–dirname与bas ...
- 问!—— 斜杆/ 和 反斜杠\ 的区别
转载自:https://www.cnblogs.com/T-J-D/p/4255041.html 正斜杠,又称左斜杠,符号是"/":反斜杠,也称右斜杠,符号是"\&quo ...
最新文章
- Python 之 Pandas (六)合并
- XAMPP下的MYSQL解决中文乱码问题
- android配置activity
- $GLOBALS -- 变量
- mysql计算用户平均下单周期
- 【AI视野·今日Robot 机器人论文速览 第八期】Wed, 16 Jun 2021
- android聊天,存储聊天记录sqlite
- hdu 2191 (多重背包二进制优化)
- 微软Windows7将捆绑杀软 众厂商面临生死抉择
- 企业Web应用中的敏捷测试和瀑布测试
- Spring源码深度解析
- 第十届中国证券金紫荆奖名单揭晓 华能国际斩获两项大奖
- JAVA高端编程研发培训班 JAVA开发视频教程
- 2019年最新全国省市区街道共46462条数据(统计局MySQL数据库)
- 如何自学Java 经典
- 春节高并发抢红包的技术升华综合实战(Node.js)
- DPABI(用于脑成像的数据处理和分析的工具箱)的下载和安装步骤
- 热释电传感器三个引脚_那些选对热释电传感器的人,都看过这篇!
- windbg 断点+单步
- 最长回文子串(马拉车算法)
热门文章
- 看我如何绕过Cloudflare 的 SQL 注入过滤
- 我要上 Pwn2Own
- Sersync实时备份服务部署实践
- postman使用之二:数据同步和创建测试集
- MSSQL 'CREATE/ALTER PROCEDURE' 必须是查询批次中的第一个语句。
- NagiosQL 3的安装
- SpringBoot之Filter过滤器的实现及排序问题
- L1-061 新胖子公式 (10 分)-PAT 团体程序设计天梯赛 GPLT
- [Java] 蓝桥杯ADV-202 算法提高 最长公共子序列
- [Java] 蓝桥杯ALGO-64 算法训练 大小写判断