shell命令的展开

517 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

每当我们在终端中输入一些命令都会熟悉的按下enter键来执行,其实在按下按键之后会发生很多事情,首先这个过程叫展开,可能展开的结果和你的输入甚至已经完全不同,但这一切都会给用户呈现,只会显示执行中的炫酷过程。我们可以通过echo命令还观察命令是如何展开的,echo是shell的内置命令,只干一件事:打印跟在它后面的参数。

比如这样:

➜  ~ echo hello world
hello world

再看下面的结果:

image.png 这里echo *并没有无脑的输出*,是不是很奇怪。因为* 代表通配符,在当前目录下就匹配了所有的文件名,通配符所依赖的工作机制叫做路径名展开,类似于ls的功能。

再来,可以做一些别的展开:

➜  / echo u*
usr

这里匹配的就是以u开头的所有文件。我们知道~对于Linux系统的意义,这里代表了home的目录,就像下面的执行结果一样,它就是代表home:

➜  / echo ~
/Users/user

说了目录,shell也可以计算算数表达式,比如:

➜  / echo 2+2
2+2

似乎不太对,怎么没有计算结果呢?当然没有,命令行可没那么智能,是需要按照格式来写的:$((expression)),上面的命令改成echo $((2+2))即可。此外,也能支持列表遍历,不过日常场景下没多大用,使用{A..Z}这样的形式来表示:

➜  / echo test{A..D}
testA testB testC testD

其实最常用的展开方式还是读取系统变量,如果不存在这个变量,会输出空格,举例如下:

➜  / echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk-11.0.7.jdk/Contents/Home