大约有20 个操作符可以用来在bash条件表达式中检查文件的属性。下面为大家介绍常用的一些。另外的一些套接字和文件描述符之类的我不是很清楚,不过传说中,黑客对此是很感兴趣的,如果有此类的朋友请移步 Google 查询,呵呵。
好久没有写bash的日志了,当时写的一些已经忘的差不多了,前些日子专门拿出一段时间来复习,学过的东西还让它丢了的话,心里会有些难过的。
bash 常用属性操作符:
| 操作符 | 如果为真 |
|---|---|
| -d file | file存在并且为一个目录 |
| -e file | file存在 |
| -f file | file存在并且为一个正规文件(即不是一个目录或其他特殊类型的文件) |
| -r file | 对file有读权限 |
| -s file | file存在并且非空 |
| -w file | 对file有可写权限 |
| -x file | 对file有可执行权限,如果为目录,则有目录搜索权限 |
| -O file | 你是file的owner所有者 |
| -G file | file的组ID匹配你的ID,如果你有多个用户组,则匹配其中一个即可 |
| file1 -nt file2 | file1 newer than file2,文件1比文件2要新,比较的是修改时间 |
| file1 -ot file2 | file2 older than file2,文件1比文件2要旧,比较的是修改时间 |
bash 组合运算符:
在bash的[和]内的条件表达式也可以使用逻辑操作符&&和||组合起来,例如:
也可以使用如下逻辑操作符将条件表达式和shell命令组合起来:
还可以使用!非操作符,这样只有当expr为假时,!expr值才为真。另外,可以通过圆括号用斜线转义防止shell对其进行特殊处理将之分组或使用如下两个逻辑操作符:-a(AND)和-o(OR),进而实现条件捷足先登符的复杂逻辑表达式。
-a和-o操作符类似于退出状态时所用的&&和||操作符,不同的是,-a和-o只在test条件表达式内可用。注意我前面介绍过,在shell中[....]等同于内置命令test。
bash 组合运算符示例:
使用bash的文件属性检查来模拟ls -l的信息,并且使用更好的,更清楚的表达方式。先写出代码,稍候我再给大家放出讲解。
file=$1
file=${file:?'必须给出参数'}
if [ ! -e $file ]; then
echo "$file 不存在,你在玩我?"
exit 1
fi
if [ -d $file ]; then
echo "$file 是一个目录,并且你小子"
if [ -x $file ]; then
echo "可以"
else
echo "不可以"
fi
echo "对此进行搜索"
elif [ -f $file ]; then
echo "$file 是一个正规文件"
else
echo "$file不是一个正规文件"
fi
if [ -O $file ]; then
echo "你是$file的拥有者"
else
echo "你不是$file的拥有者,别想没用的了"
fi
if [ -r $file ]; then
echo "你对$file拥有"
else
echo "你并不对$file拥有"
fi
echo "可读权限"
if [ -w $file ]; then
echo "你对$file拥有"
else
echo "你并不对$file拥有"
fi
echo "可写权限"
if [ -x $file -a ! -d $file ]; then
echo "你拥有对$file"
else
echo "你并不拥有对$file"
fi
echo "可执行的权限"
运行./ls.sh ~/www/shell/pro.html,得到结果如下:

bash模拟ls -l
看这里的代码,因为我用中文写的描述,所以不难看懂,唯一对最后一句:if [ -x $file -a ! -d $file ]; 的条件可能有一些不理解,这里简单描述一下:
这里先判断$file变量是否可执行,并且(-a)$file变量不是一个目录——! -d $file的时候输出”你拥有对$file”.其等价于 [ \(-x $file\) -a ( ! -d $file \) ] 文件测试首先被执行,然后是符号!,然后是AND和OR测试。
无限感慨:
唉,程序一天不写就会生疏,只有常写才会有所提升。现在长时间不写shell果然写起来很累。呵呵。
抢沙发~~不懂,纯支持~~呵呵