Shell:区分有效命令和表达式
首先要区分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]> ls
ls zzz
[19:31 ~/Desktop/t]> ls zzz
zzz
[19:31 ~/Desktop/t]> `ls`
zzz
shell下的表达式举例(表达式中操作符详情参考其他笔记):
$var #返回变量var的值
`ls` #返回ls命令的执行结果
$(ls) #同上
$((3+4)) #返回3+4的值
$[ 3+4 ] #同上
使用$()
或``
将命令结果赋值给变量时,加双引号能保留换行符:
cat t.txt
a
b
echo `cat t.txt`
a b #换行丢失
echo "`cat t.txt`" #加引号后换行保留
a
b