0
点赞
收藏
分享

微信扫一扫

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


由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。

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语句(如果有)。


举报

相关推荐

0 条评论