在linux中,命令替换是一专业名词。不是有替换功能的命令(不是指grep、sed、awk和find等命令),而是指命令执行后的结果作一种替换。
一、命令执行
我们知道,bash命令执行后,都会有一定的结果,或达到功能要求,或执行成功,或输出字符到标准输出(电脑屏幕)上,或重定向到一个文件而没有标准输出。而命令替换是把命令的标准输出赋值给某个变量(此处默认命令执行一定有结果,肯定有标准输出)。
二、命令替换
命令执行结果的默认处理方式是标准输出。而想保存为文件,可以用>filename表达;如果想保存为变量则需要用var=`cmd`或$(cmd)表达。
把命令替换保存为一个变量,称为正常命令替换,而把命令替换保存为一个无名变量,直接在另外一个命令中作为参数使用,称为无名变量命令替换。这种方式可能应用的更多。
在一个命令中,不能再同等层次执行另一个命令,也就是说,命令执行不能嵌套!
命令替换解决了命令嵌套的问题。
三、表达与案例
linux-命令替换的正确理解
命令替换是指将命令的执行结果替换默认标准输出而进行的一种有效处理。一种方式是命令替换为某一变量,另一种方式是命令替换为另一命令的参数(或选项)。
bash shell定义了两种语法进行命令替换。一种是使用反引号,另一种是利用$(),两种功能等价。
具体格式如下:
`linux命令`
$(linux命令)
反引号指的是table键上面的那个键,和波浪线(~)同一个键。
案例:变量式命令替换
name=`cat a.txt`
echo $name
案例:命令嵌套式命令替换
echo "myfile are `cat a.txt|wc -l` line"
echo "myfilesrc is $(pwd)"
四、命令嵌套
命令替换实际上是一种命令嵌套:一个命令中包含另一个命令。两个命令不能处于同一等级,一个命令只能是另一个命令的参数或选项。
命令执行后有一结果,可以作为一个变量的值,可以作为一个命令的参数。
age=`ls ./ |wc -l`
file1=`cat a.txt`
echo "myfile are `wc -l a.txt` line."
如果在命令替换中还有命令替换,最好用两种方式分别使用一次。
命令替换执行过程:先完成反引号里的命令行,然后将其结果替换出来,再重组成新的命令行。
在操作上,这两者都是达到相应的效果,但是建议使用$( ),理由如下:
a.``很容易与''搞混乱,尤其对初学者来说。
b.在多层次的复合替换中,``必须要额外的转义处理(反斜线),而$( )比较直观。
最后,$( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。
小结
与管道符的使用相比,命令替换同样具有把一个命令的结果再送给另一个命令处理的功能。
在介绍管道符|时,一般同时介绍命令替换符` `和$()就是这个道理!
PS: 管道 管道符 |
标准输出 标准输出符 1>或>
命令替换 命令替换符 ``或$()
变量替换 变量替换符 ${}