烂笔头笔记:温故而知新,你真的了解Linux Shell中的方括号“[”吗?

Posted Jack_Chai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了烂笔头笔记:温故而知新,你真的了解Linux Shell中的方括号“[”吗?相关的知识,希望对你有一定的参考价值。

本文出处:http://blog.csdn.net/chaijunkun/article/details/109359593,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。

Shell中的方括号

在写Linux Shell的时候,判断一个文件是否存在,我们经常这样写:

if [ -f "project.log" ]; then
echo "log exists"
else
echo "log does not exsit"
fi

那么这里面的方括号“[”对于初学Linux Shell的开发者来说,可能属于死记硬背的范围,都知道后面必须加一个空格,然后关于判断条件,有如下几种选择:

功能含义
-e filename如果 filename存在,则为真
-d filename如果 filename为目录,则为真
-f filename如果 filename为常规文件,则为真
-L filename如果 filename为符号链接,则为真
-r filename如果 filename可读,则为真
-w filename如果 filename可写,则为真
-x filename如果 filename可执行,则为真
-s filename如果文件长度不为0,则为真
-h filename如果文件是软链接,则为真

但是,你有没有想过,这样一个方括号究竟是什么?

意外收获

在学习linux内部命令时,发现了这样一个文件“[”,不管你信不信,这个可执行文件的名字——就是方括号。

在Linux中执行如下命令:

[root@localhost bin]# cd
[root@localhost ~]# cd /usr/bin/
[root@localhost bin]# ls -al | grep "\\["
-rwxr-xr-x.   1 root root      41488 8月  20 2019 [
[root@localhost bin]#  

原来,他是一个可执行程序,那我们来执行一下:

[root@localhost bin]# [
-bash: [: 缺少 `]'  

咦?提示缺少右括号,看这结构似乎明白了。这不就组成了Shell中的[ xxxx ]结构了嘛。
尝试解读它的类型:

[root@localhost bin]# type [
[ is a shell builtin

提示为:shell内建命令。我们也就不难理解了。其实,Shell中的方括号“[”,也是一个命令,而这个命令要以右方括号结尾。中间的无论是 -e -d -f还是-s,统统都是方括号“[”的参数。这也就不难理解,为什么在Shell编写过程中,条件判断无法像其他高级语言一样,实现括号后面的空格自动识别了。

如何运行

我们尝试在bash中直接运行一个这样的命令:

[root@localhost ~]# [ -f "project.log" ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -f "test" ]
[root@localhost ~]# echo $?
1

在当前目录下,有一个名为project.log的文件。直接运行方括号命令后,并没有任何标准输出提示信息。然后使用$?来看下这条命令的执行结果:0,表示该条命令成功执行。这说明文件存在。那么我们尝试一个不存在的文件呢?它的执行返回结果为1,说明执行不成功。

Shell中的if语句,就是判断后面的命令是否执行成功。若成功(返回0),则表示符合条件;否则,执行else语句(如果有)。

以上是关于烂笔头笔记:温故而知新,你真的了解Linux Shell中的方括号“[”吗?的主要内容,如果未能解决你的问题,请参考以下文章

烂笔头笔记:Charles工具在Windows系统中闪退(无法打开)的问题修复

烂笔头笔记:Charles工具在Windows系统中闪退(无法打开)的问题修复

烂笔头笔记:Charles工具在Windows系统中闪退(无法打开)的问题修复

烂笔头笔记:关于frontend-maven-plugin插件无法下载nodejs和npm的问题

loadrunner笔记----好记性不如烂笔头

烂笔头笔记:favicon配置不是所有浏览器都兼容