首先要区分shell语句的执行后果和shell操作符的返回值:
echo "abcd"
语句的执行后果是打印abcd,并非这个语句的返回值是abcd。$var
表达式中$
操作符的返回值是变量var的值。``
或$()
操作符能够将其包裹的shell语句的打印结果作为返回值返回。下面详细说明: shell中有一些操作符,这些操作符能够返回一些值,这些值若不是有效的shell命令就不能直接在shell里运行,举例说明:
比如$
操作符能够返回变量的值: i=abcd$i #返回字符串abcd,直接在shell里输入$i回车,会提示找不到为abcd的shell命令。
但是可以将$i
返回的值作为其他命令的参数,如:
echo $i #会打印abcd
也可以作为值赋给其他变量,如:
j=$i
同理,``
操作符能够将其包裹命令的执行结果返回:
`echo "abcd"` #返回字符串abcd,直接在shell里输入`echo "abcd"`也会报错,因为abcd不是shell命令。
假设一个文件夹下只有两个文件(ls和zzz),在此文件夹下执行ls
会打印zzz,什么原因?
ls
会返回ls命令的执行结果(也就是字符串"ls zzz"),shell将这个执行结果解释为命令,然后执行,执行的结果就是打印zzz。 [19:31 ~/Desktop/t]> lsls zzz[19:31 ~/Desktop/t]> ls zzzzzz[19:31 ~/Desktop/t]> `ls`zzz
shell下的表达式举例(表达式中操作符详情参考其他笔记):
$var #返回变量var的值`ls` #返回ls命令的执行结果$(ls) #同上$((3+4)) #返回3+4的值$[ 3+4 ] #同上
使用$()
或``
将命令结果赋值给变量时,加双引号能保留换行符:
cat t.txtabecho `cat t.txt`a b #换行丢失echo "`cat t.txt`" #加引号后换行保留ab