这应该是初学bash的同学最早遇到的问题,因为站长最近需要写关于linux shell的作业,所以也看了一下bash。
有的同学说这很简单呀,if [ -e "file" ]; then xxxx,-e这个操作符就能判断某个文件是否存在。
另外,下面是一些判断文件属性的操作:

001.jpg

所以这个问题是否就结题了呢?
那我们来做个试验,写一个如下shell,判断当前目录下是否存在文件$1,$1就是我们给shell传入的第一个参数。例如,./exists.sh "file"就判断文件"file"是否存在。

#!/bin/sh

if [ ! $# -eq 1 ]; then
    echo "Usage : $0 file"
    exit 0
fi 

if [ -e $1 ]; then 
    echo "File $1 exists"
else
    echo "Oooops ~ File $1 not exists"
fi

代码比较简单,先判断参数个数是否是1,如果不是就输出usage然后退出。再就用-e来判断$1是否是一个已存在的文件,如果是则输出exists,否则输出0ooops。
然后我们来做试验了。首先我们看看目录下有哪些文件:

002.jpg

有01、02、03、CHANGE.TXT、exists.sh、no1.sh一共6个文件,没有目录。
简单测试一下,脚本功能是ok的:

003.jpg

01存在而05不存在。
但是但是,如果我们传入的参数是一个空字符串,看看脚本运行是什么结果:

004.jpg

是不是很奇怪?明明不存在""这个文件,但结果却是File exists。我们可以把-e换成-f,结果都一样。
也就是说,在shell中,如果-e、-f等此类判断符号后面接着一个内容为空的字符串的时候,就会认为结果为真,从而出现一个"BUG",当BUG在被用到了特殊位置的时候,甚至可能是一个漏洞。
实话说,除了再去判断$1是否为""之外,我还不知道有什么更优雅的方法去解决这个问题。