测试环境: RedHat 2.6.18-128.el5
在shell中有三种替换功能:
变量替换,命令替换和波浪号替换
替换的目的是加快命令行输入和提高shell的灵活性(废话)。
变量替换:
每个被定义的变量都有一个值(value)与其相关。当在变量名前面加一个美元符号($)时,shell会用这个变量的值(value)替换这个参数。此过程就是变量替换。
可以使用set命令查看所有的用户变量:
[ghl@localhost work]$ set BASH=/bin/bash BASH_ARGC=() BASH_ARGV=() BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu") BASH_VERSION='3.2.25(1)-release' COLORS=/etc/DIR_COLORS COLUMNS=80 未完全粘贴......
[ghl@localhost work]$ var1=value1[ghl@localhost work]$ set | grep var1var1=value1[ghl@localhost work]$ echo the value of var1 is$var1the value of var1 isvalue1推荐用大括号{}
[ghl@localhost work]$ echo the value of var1 id ${var1} the value of var1 id value1[ghl@localhost work]$ pwd /home/ghl/work [ghl@localhost work]$ cat f2 Mon Mar 26 14:30:18 CST 2012 [ghl@localhost work]$ file_name1=/home/ghl/work/f2 [ghl@localhost work]$ cat ${file_name1} Mon Mar 26 14:30:18 CST 2012
命令替换:
命令替换就是在同一个命令行中用一个命令的输出结果替换该命令。标准语法(POSIX)是$(command),但是在Bourne shell中也支持重音键 `command`
说起来有点绕,看下面的例子吧:
[ghl@localhost work]$ pwd1=$(pwd) [ghl@localhost work]$ pwd2=`pwd` [ghl@localhost work]$ echo $pwd1 /home/ghl/work [ghl@localhost work]$ echo $pwd2 /home/ghl/work [ghl@localhost work]$ set | grep pwd pwd1=/home/ghl/work pwd2=/home/ghl/work
注意下面例子中单引号和双引号(在这里就不说了)[ghl@localhost work]$ echo "current working folder is $(pwd)" current working folder is /home/ghl/work [ghl@localhost work]$ echo "current working folder is `pwd`" current working folder is /home/ghl/work [ghl@localhost work]$ echo 'current working folder is $(pwd)' current working folder is $(pwd) [ghl@localhost work]$ echo 'current working folder is `pwd`' current working folder is `pwd`
波浪号替换:
以波浪号(~)开头的脚本,波浪号会被替换。具体规则如下:
1. 单独的波浪号(~),用HOME变量的值替换;
2. 波浪号后紧跟一个加号(~+),用PWD变量的值替换;-- 注意是变量,而不是命令
3. 波浪号后紧跟一个减号(~-),用OLDPWD变量的值替换; -- OLDPWD为cd命令之前的工作目录;
4. 波浪号后面紧接着几个字符,然后接着一个 / ,shell会核对这几个字符是否与某个系统的用户名匹配,如匹配,那么用 /home 替换波浪号;
[ghl@localhost work]$ set | grep -i pwd OLDPWD=/tmp PWD=/home/ghl/work pwd1=/home/ghl/work pwd2=/home/ghl/work [ghl@localhost work]$ echo ~ /home/ghl [ghl@localhost work]$ echo ~+ /home/ghl/work [ghl@localhost work]$ echo ~- /tmp [ghl@localhost work]$ echo ~ghl/ /home/ghl/ [ghl@localhost work]$ echo ~ghl1/ /home/ghl1/ [ghl@localhost work]$ echo ~root/ /root/
-- 注意这个只有root用户是不一样的结论或者区别如下:
1. 变量替换时变量值替换变量名;命令替换时命令的输出替换命令;波浪号替换是一种特殊的变量替换(只是语法形式不一样,不用加$符号和大括号);
2. 变量替换的语法是 ${parname} ,命令替换的语法形式是$(parname) 和 `parname`.
3. 变量替换和命令替换在单引号表达式里面要被去转义(失效)。