区分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特殊字符。

以上就是区分shell中的 反引号、$()和${}的详细内容,更多关于shell中的 反引号、$()和${}的资料请关注我们其它相关文章!

(0)

相关推荐

  • linux shell中单引号、双引号、反引号、反斜杠的区别

    1. 单引号 ( '' ) # grep Susan phonebook Susan Goldberg 403-212-4921 Susan Topple 212-234-2343 如果我们想查找的是Susan Goldberg,不能直接使用grep Susan Goldberg phonebook命令,grep会把Goldberg和phonebook当作需要搜索的文件 # grep 'Susan Gold' phonebook Susan Goldberg 403-212-4921 当shel

  • PowerShell脚本反引号用法实例:随时随地给代码换行

    为了增强可读性,大家都喜欢将很长的本来可以一行写完的脚本分割成多行. 复制代码 代码如下: Get-Service | Where-Object { $_.Status -eq 'Running' }   Get-Service | Where-Object { $_.Status -eq 'Running' } 在管道符号结束以后,我们可以直接换行.有时遇到花括号时,也可以非常安全的换行: 复制代码 代码如下: Get-Service |   Where-Object { $_.Status

  • 区分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)反引号与单引号外形

  • Linux Shell中三种引号的用法及区别

    Linux Shell中有三种引号,分别为双引号(" ").单引号(' ')以及反引号(` `). 其中双引号对字符串中出现的$.''.`和\进行替换:单引号不进行替换,将字符串中所有字符作为普通字符输出,而反引号中字符串作为shell命令执行,并返回执行结果.具体含义如下: 双引号(" "):在双引号中,除了$, '', `和\以外所有的字符都解释成字符本身. 单引号(' '):在单引号中所有的字符包括特殊字符($,'',`和\)都将解释成字符本身而成为普通字符.

  • Linux Shell中的特殊符号和含义简明总结(包含了绝大部份)

    在Linux Shell中有很多的特殊符号,这对于我们写Shell脚本时要特别留意:一方面要知道这些特殊符号的用法,这些符号用好了可以达到事半功倍的效果:但另一方面要避免这些特殊符号的过度使用而导致脚本难以调试.难以阅读. 这些特殊符号罗列出来大致如下: 复制代码 代码如下: # ; ;; . , / / 'string'| ! $ ${} $? $$ $* "string"* ** ? : ^ $# $@ `command`{} [] [[]] () (()) || &~ ~

  • Shell中特殊字符的用法总结大全

    前言 众所周知shell既是类Unix操作系统的命令解析器,用于解释执行用户输入的一连串命令,它类似于DOS下的command和后来Windows的cmd.exe.同时shell也是一种程序设计语言.作为命令解释型的脚本语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令:作为程序设计语言,它预定义了各种环境变量,保留了一些关键字以及一些特殊字符的含义,并提供了许多在高级语言中才具有的控制结构,包括循环和分支判断. 本文将给大家介绍关于Shell特殊字符用法的相关内

  • 详解 Shell中的grep命令

    用'grep'搜索文本文件 如果您要在几个文本文件中查找一字符串,可以使用'grep'命令.'grep'在文本中搜索指定的字符串.举个例子:假设您正在'/usr/src/linux/Documentation'目录下搜索带字符串'magic'的文件: $ grep magic /usr/src/linux/Documentation/* sysrq.txt:* How do I enable the magic SysRQ key? sysrq.txt:* How do I use the ma

  • shell中的各种括号的使用方法

    在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量,命令的用法,如下: 1.${var} 2.$(cmd) 3.()和{} 4.${var:-string},${var:+string},${var:=string},${var:?string} 5.$((exp)) 6.$(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern) 现在分述如下: 1.Shell中变量的原形:${var} 大家常见的变量形式都是$va

  • 区分java中String+String和String+char

    我们来考虑一个关于java中String的问题: "abc" + '/'和 "abc" + "/"的区别. 通过这个例子, 我们可以顺便练习一下JDK工具中javap的用法, 原问题是这样的: 把斜杠/当作字符或字符串有什么区别呢? 一个是当作基本数据类型char,一个是对象String.具体有什么区别呢? 当作字符效率会更高吗? String str = "abc" + '/'; 和 String str = "a

  • Bash脚本中括号和反引号的使用

    目录 示例 讨论 总结 在 Bash 脚本中,我们经常需要引用变量或者命令的执行结果来作为文件的名字或者日志的输出,在脚本或者 Shell 中我们可以使用反引号 或者括号 () 来获取到变量的内容 示例 示例 1 获取日期的输出 echo `date` # output 2021年 01月 05日 星期二 15:21:23 CST echo $(date) # output 2021年 01月 05日 星期二 15:21:32 CST 通过使用反引号或者括号我们可以将命令的输出做为脚本中的内容输

  • linux shell中Grep命令查找多个字符串(grep同时匹配多个关键字或任意关键字)

    目录 前言 1.Grep命令搜索多个字符串 2.grep同时匹配多个关键字或任意关键字 2.1与操作 2.2 或操作 2.3其他操作 附:grep参数说明 总结 前言 grep 命令支持三种正则表达式语法:Basic.Extended 和 Perl-compatible .当没有指定正则表达式类型时,grep 命令将搜索模式默认为基本正则表达式. 要搜索多个匹配模式,可以使用 OR ( alternation ) 运算符.我们可以用 OR 运算符 |( pipe )指定不同的匹配项,这些匹配项可

  • Shell中函数返回值超出问题

    1.前言 快半年没有写博客了,荒废了很久,工作中的杂事太多,自己越来越懒了.为了鞭策自己成长,还是要坚持写写博客,记录自己的成长. 2.shell函数介绍 语法: 复制代码 代码如下: [ function ] funname [()] {   action;     [return int;]  } 说明: (1)可以带function fun()  定义,也可以直接fun() 定义,不带任何参数. (2)参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值

随机推荐