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
posted @ 2018-12-20 08:59  xuejianbest  阅读(207)  评论(0编辑  收藏  举报