13.2.3 命令替换
命令替换是指将命令的标准输出作为值赋给某个变量。比如,在某个目录中输入ls命令可查看当前目录中所有的文件,但如何将输出存入某个变量中呢?这就需要使用命令替换了,这也是Shell编程中使用非常频繁的功能。
Shell中有两种方式可以完成命令替换,一种是反引号(`),一种是$(),使用方法如下:
- [root@localhost ~]# `
- 命令`
或
- [root@localhost ~]# $(
- 命令)
运行系统命令date可以得到当前的系统时间。在很多时候我们需要记录脚本运行时间,所以只是运行这个命令是没有意义的,必须将该命令的运行结果记录并保存到变量中,并持久化到文件中,才能为后期分析提供有用的参考依据。
- #
- 用两种命令替换方式记录date
- 命令的输出
- [root@localhost ]# DATE_01=`date`
- [root@localhost ]# DATE_02=$(date)
- [root@localhost ]# echo $DATE_01
- Tue Apr 23 14:33:49 CST 2013
- [root@localhost ]# echo $DATE_02
- Tue Apr 23 14:34:05 CST 2013
如果被引用的命令输出的内容包括多行,此时若不通过引用的方式输出变量,则输出的内容中将会删除换行符,文件名之间会使用系统默认的空来填充,即输出的内容只占一行。
- [root@localhost ]# LS=`ls -l`
- #
- 不引用变量值的输出
- [root@localhost ]# echo $LS
- total 36 -rw------- 1 root root 1017 Jan 2 2009 anaconda-ks.cfg
- -rw-r--r-- 1 root root 18590 Jan 2 2009 install.log
- -rw-r--r-- 1 root root 0 Jan 2 2009 install.log.syslog
- #
- 引用变量值的输出
- [root@localhost ~]# echo "$LS"
- total 36
- -rw------- 1 root root 1017 Jan 2 2009 anaconda-ks.cfg
- -rw-r--r-- 1 root root 18590 Jan 2 2009 install.log
- -rw-r--r-- 1 root root 0 Jan 2 2009 install.log.syslog
以上使用反引号的部分都可以使用$()进行替换,因为它们是等价的。但反引号毕竟和单引号看起来类似,有时候会对查看代码造成困难,而使用$()就相对清晰,能有效地避免这种混乱。但是有些情景是必须使用$()的:$()支持嵌套,而反引号不行。下面的例子演示了使用计算ls命令列出的第一个文件的行数,这里使用了两层嵌套。
- [root@localhost ~]# Fir_File_Lines=$(wc -l $(ls | sed -n '1p'))
- [root@localhost ~]# echo $Fir_File_Lines
- 36 anaconda-ks.cfg
要注意的是,$()仅在Bash Shell中有效,而反引号可在多种UNIX Shell中使用。所以这两种命令替换的方式各有特点,究竟选用哪种方式全看个人的喜好。