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 反引号、$() 和 ${} 的区别相关推荐

  1. html代码中本地路径里斜杠 / 和反斜杠 \ 的区别

    总结: windows和unix,linux本地路径里的 / 和 \ 在html代码里:错误文件路径: windows 只使用一个 \ 是不识别的, src='D:\个人\图片\2.jpg' unix ...

  2. 反引号包裹反引号_五个金色反引号

    反引号包裹反引号 五种琴弦 从Java 1.0开始,我们就有了字符串文字"like this" . 我们还想要其他什么字符串? 其他编程语言为我们提供: 表达式插值: s" ...

  3. linux目录下有斜杠,Windows和Linux路径中斜杠/和反斜杠\ 的区别

    Unix使用斜杆/ 作为路径分隔符,而web应用最新使用在Unix系统上面,所以目前所有的网络地址都采用 斜杆/ 作为分隔符. Windows由于使用 斜杆/ 作为DOS命令提示符的参数标志了,为了不 ...

  4. 正反斜杠的区别_电脑中的正斜杠(/)与反斜杠(\)的区别

    计算机中的正斜杠(/)与反斜杠(\)的区别 正斜杠,符号是"/";反斜杠,符号是"\". 一直很不解正斜杠与反斜杠到底有何区别?经过一段时间的理解,得出 DOS ...

  5. 数字的原码,补码,反码,~和‘-’的区别。取反与负号的区别。

    一.原码,反码,补码的基础概念和计算方法. 原码,反码,补码只是计算机存储数字的一种方式. 1,原码 原码就是用第一位表示符号位,其余位表示值,比如8位的二进制数 [+1]原 = 0000 0001 ...

  6. 【总结】斜杠/和反斜杠\ 的区别

    路径中 斜杠/和反斜杠\ 的区别 前言 总结 前言 本章主要总结:路径中 斜杠与反斜杠的区别. 路径中使用斜杠/和反斜杠\的区别到底是什么. 1.正斜杠,又称左斜杠,符号是"/": ...

  7. 路径中 斜杠/和反斜杠\ 的区别

    路径中使用斜杠/和反斜杠\的区别到底是什么. 1.正斜杠,又称左斜杠,符号是"/":反斜杠,也称右斜杠,符号是"\". 2.在Unix/Linux中,路径的分隔 ...

  8. 正斜杠(/)和反斜杠(\)的区别

    正斜杠(/)和反斜杠(\)的区别 正斜杠,符号是"/"; 反斜杠,符号是"\". 正斜杠/表示除法,分割. 在unix系统中,正斜杠/表示目录.由于web遵循u ...

  9. 【Shell系列】$(shell pwd)和$(pwd)用法区别

    Date: 2019-5-8 1.参考 $(shell pwd)和$(pwd)有什么区别 shell 基础 $(cd `dirname $0`;pwd) Linux常用命令简述–dirname与bas ...

  10. 问!—— 斜杆/ 和 反斜杠\ 的区别

    转载自:https://www.cnblogs.com/T-J-D/p/4255041.html 正斜杠,又称左斜杠,符号是"/":反斜杠,也称右斜杠,符号是"\&quo ...

最新文章

  1. Python 之 Pandas (六)合并
  2. XAMPP下的MYSQL解决中文乱码问题
  3. android配置activity
  4. $GLOBALS -- 变量
  5. mysql计算用户平均下单周期
  6. 【AI视野·今日Robot 机器人论文速览 第八期】Wed, 16 Jun 2021
  7. android聊天,存储聊天记录sqlite
  8. hdu 2191 (多重背包二进制优化)
  9. 微软Windows7将捆绑杀软 众厂商面临生死抉择
  10. 企业Web应用中的敏捷测试和瀑布测试
  11. Spring源码深度解析
  12. 第十届中国证券金紫荆奖名单揭晓 华能国际斩获两项大奖
  13. JAVA高端编程研发培训班 JAVA开发视频教程
  14. 2019年最新全国省市区街道共46462条数据(统计局MySQL数据库)
  15. 如何自学Java 经典
  16. 春节高并发抢红包的技术升华综合实战(Node.js)
  17. DPABI(用于脑成像的数据处理和分析的工具箱)的下载和安装步骤
  18. 热释电传感器三个引脚_那些选对热释电传感器的人,都看过这篇!
  19. windbg 断点+单步
  20. 最长回文子串(马拉车算法)

热门文章

  1. 看我如何绕过Cloudflare 的 SQL 注入过滤
  2. 我要上 Pwn2Own
  3. Sersync实时备份服务部署实践
  4. postman使用之二:数据同步和创建测试集
  5. MSSQL 'CREATE/ALTER PROCEDURE' 必须是查询批次中的第一个语句。
  6. NagiosQL 3的安装
  7. SpringBoot之Filter过滤器的实现及排序问题
  8. L1-061 新胖子公式 (10 分)-PAT 团体程序设计天梯赛 GPLT
  9. [Java] 蓝桥杯ADV-202 算法提高 最长公共子序列
  10. [Java] 蓝桥杯ALGO-64 算法训练 大小写判断