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