之前介绍过shell有两种方式可以取得变量的值:通过赋值语句,或者是以命令参数传递给脚本。下面来介绍另一种方式,用命令替换。
命令替换:允许你使用命令的标准输出就好像它是一个变量值一样。其语法为:$(UNIX command))
这其实和PHP的命令替换是很像的,举个PHP的例子先说明一下什么叫命令替换:
$var_sec = 'yyy';
$var_thi = $$var_fir;
var_dump($var_thi);
结果返回的是’yyy’,很明显$$var_fir被替换成了$var_sec。和此类似,shell中你也可以进行命令替换,例如:
$(pwd)值为当前目录(等同于环境变量$PWD)
$(ls $HOME)为用户根目录下的所有文件名
$(ls $(pwd))为当前目录下所有文件名
就是这样,也许你会问这有啥用啊?用途何在?一般都啥时候用到这个命令替换?
这才是最根本的,因为只知道有一个强大的工具,却不知道如何去使用,那么这个工具是会生锈的,毫无价值。
仔细看我上面举的例子你就会明白了,一般在终端中做命令替换是有必要的,这样可以将一个命令的结果做为另一个命令的参数。
比如书中的这个例子我认为很不错,就是要发一个邮件信息给当前已登录的所有用户:
who命令可以输出当前所有在线的人的信息
root ty1 Oct 13 12:05
simaopig ty1 Oct 13 01:05
xiaoxiaozi ty1 Oct 13 09:05
这里中间的是由空格分隔的,而不TAB。因为这里我们只需要第一列的值,即用户名。
所以,我们可以在cut命令中使用空格来作为域分隔符来处理
所以,获得所有登录的人的名字的命令就是:
who | cut -d ' ' -f1
同理,为这些人发邮件的命令就是
mail $(who | cut -d ' ' -f1