【shell】反引号(`)与$()的作用与区别

时间:2022-03-15 21:46:21

linux下的反引号(`)和$()执行的是命令替换的功能。

1、 将命令的执行结果赋给一个变量

反引号:
DATE=`date` //变量=`命令`
echo $DATE

执行结果为:

[lzk@bogon Signal_shell]$ sh -x myshell.sh
++ date
+ DATE='Wed Mar 22 22:43:08 CST 2017'
+ echo Wed Mar 22 22:43:08 CST 2017
Wed Mar 22 22:43:08 CST 2017

注意我们使用sh -x 执行shell脚本时,会分析显示出脚本的执行过程。

$():

DATE=$(date) //变量=$(命令)
echo $DATE

执行结果:

[lzk@bogon Signal_shell]$ sh -x myshell.sh
++ date
+ DATE='Wed Mar 22 22:43:08 CST 2017'
+ echo Wed Mar 22 22:43:08 CST 2017
Wed Mar 22 22:43:08 CST 2017

2、 将一条命令的执行结果方到另一条命令里。


echo time is `date`
或者
echo time is  $(date)

结果:
[lzk@bogon Signal_shell]$ sh -x myshell.sh
++ date
+ echo time is Wed Mar 22 22:49:19 CST 2017
time is Wed Mar 22 22:49:19 CST 2017


将fine -name 的结果返回给rm ,删除所有 .txt 文件
rm `find -name "*.txt"`

这里有个比较有趣的地方:
当我们执行:

L=`ls -al`
echo $L

结果:


[lzk@bogon Signal_shell]$ sh -x myshell.sh
++ ls -al
+ L='total 12
drwxrwxr-x. 2 lzk lzk 4096 Mar 23 10:07 .
drwxrwxr-x. 3 lzk lzk 4096 Mar 21 22:19 ..
-rw-rw-r--. 1 lzk lzk  532 Mar 23 10:07 myshell.sh'
+ echo total 12 drwxrwxr-x. 2 lzk lzk 4096 Mar 23 10:07 . drwxrwxr-x. 3 lzk lzk 4096 Mar 21 22:19 .. -rw-rw-r--. 1 lzk lzk 532 Mar 23 10:07 myshell.sh
total 12 drwxrwxr-x. 2 lzk lzk 4096 Mar 23 10:07 . drwxrwxr-x. 3 lzk lzk 4096 Mar 21 22:19 .. -rw-rw-r--. 1 lzk lzk 532 Mar 23 10:07 myshell.sh


这个命令用于显示当前目录下的所有文件,但是并没有换行输出,因为echo $L将换行符丢掉了。我们可以给$L加引号来解决这一问题。


echo "$L"

结果:

[lzk@bogon Signal_shell]$ sh -x myshell.sh
++ ls -al
+ L='total 12
drwxrwxr-x. 2 lzk lzk 4096 Mar 23 10:09 .
drwxrwxr-x. 3 lzk lzk 4096 Mar 21 22:19 ..
-rw-rw-r--. 1 lzk lzk  534 Mar 23 10:09 myshell.sh'
+ echo 'total 12
drwxrwxr-x. 2 lzk lzk 4096 Mar 23 10:09 .
drwxrwxr-x. 3 lzk lzk 4096 Mar 21 22:19 ..
-rw-rw-r--. 1 lzk lzk  534 Mar 23 10:09 myshell.sh'
total 12
drwxrwxr-x. 2 lzk lzk 4096 Mar 23 10:09 .
drwxrwxr-x. 3 lzk lzk 4096 Mar 21 22:19 ..
-rw-rw-r--. 1 lzk lzk  534 Mar 23 10:09 myshell.sh



反引号(`)和$()的区别

1、嵌套问题,就近的两个反引号会进行匹配,容易造成问题。
如当我们用反引号写出如下脚本:

echo $(echo $(date))
echo `echo `date``

执行后你会发现,$()的嵌套命令成功了,而``的嵌套命令没有成功。

[lzk@bogon Signal_shell]$ sh -x myshell.sh
+++ date
++ echo Thu Mar 23 10:16:04 CST 2017
+ echo Thu Mar 23 10:16:04 CST 2017
Thu Mar 23 10:16:04 CST 2017
++ echo
+ echo date
date

在反引号的嵌套中,前面两个反引号相匹配,后面两个反引号相匹配。date则被认定成立字符串。

2、\ 的转义问题  
反引号自动将单个的\转换成没有特殊意义的\ ,若想让\再次拥有特殊意义,则在前面再加上一个\  即 :\\ = \。
$()没有转换\的意思,保留原来的\,即单个的\是具有特殊意义的,即 \ = \。
比如:

echo `echo \\\\\w`
echo $(echo \\\\\w)
结果为:

[lzk@bogon Signal_shell]$ sh -x myshell.sh
++ echo '\w'
+ echo '\w'
\w
++ echo '\\w'
+ echo '\\w'
\\w