Linux下的Shell编程(欧拉篇四)test方括号命令的使用方法之检测文件是否存在和检测文件的类型
文章目录
- 摘要:块设备判定、字符设备判定、软链接判定、命名管道判定、套接字判定、目录判定、文件是否存在判定、非目录文件的存在判定、文件大小大于零判定。
检测文件是否存在,并且检测文件的类型
一、块设备判定表达式:[ -b FILE ]
- 表达式说明:判定文件存在并且是块专用的,表达式返回值 true
实例:判定目录 /dev/ 下有多少块文件。
#!/bin/bash
# 等待用户输入目录
read -p "请输入要查询的目录:" dir
dir="$dir"'*'
echo "要查询的目录是:$dir"
for fname in $dir; do
if [ -b "$fname" ]; then
echo "$fname 是块设备文件。"
fi
done
- 运行脚本,显示运行结果:
[root@localhost ~/test]$./vartest22.sh
请输入要查询的目录:/dev/
要查询的目录是:/dev/*
/dev/cdrom 是块设备文件。
/dev/dm-0 是块设备文件。
/dev/dm-1 是块设备文件。
/dev/sda 是块设备文件。
/dev/sda1 是块设备文件。
/dev/sda2 是块设备文件。
/dev/sr0 是块设备文件。
[root@localhost ~/test]$
二、字符设备判定表达式:[ -c FILE ]
- 表达式说明:判定FILE存在并且是特殊字符(字符设备),表达式返回值 true
实例:判定目录 /dev/ 下有多少字符设备文件。
#!/bin/bash
# 等待用户输入目录
read -p "请输入要查询的目录:" dir
dir="$dir"'*'
echo "要查询的目录是:$dir"
for fname in $dir; do
if [ -c "$fname" ]; then
echo "$fname 是字符设备文件。"
fi
done
- 运行脚本,显示运行结果(因为显示数量大,这里就不全展示了):
[root@localhost ~/test]$./vartest23.sh
请输入要查询的目录:/dev/
要查询的目录是:/dev/*
/dev/autofs 是字符设备文件。
/dev/btrfs-control 是字符设备文件。
/dev/console 是字符设备文件。
/dev/cpu_dma_latency 是字符设备文件。
/dev/cuse 是字符设备文件。
/dev/dmmidi 是字符设备文件。
/dev/fb0 是字符设备文件。
/dev/full 是字符设备文件。
/dev/fuse 是字符设备文件。
/dev/hidraw0 是字符设备文件。
/dev/hidraw1 是字符设备文件。
三、软链接判定表达式:[ -L FILE ] 和 [ -h FILE ]
- 表达式说明:判定FILE存在并且是一个符号链接(也叫软链接)(与-h相同),表达式返回值 true
实例:判定给定目录下有多少软链接。
#!/bin/bash
echo "使用 -L 参数查询目录:$1"
for fname in $1; do
if [ -L "$fname" ]; then
echo "$fname 是软链接"
fi
done
- 运行脚本,显示运行结果:
[root@localhost ~/test]$./vartest25.sh /etc/\*
使用 -L 参数查询目录:/etc/*
/etc/grub2.cfg 是软链接
/etc/init.d 是软链接
/etc/localtime 是软链接
/etc/mtab 是软链接
/etc/rc0.d 是软链接
/etc/rc1.d 是软链接
/etc/rc2.d 是软链接
/etc/rc3.d 是软链接
/etc/rc4.d 是软链接
/etc/rc5.d 是软链接
/etc/rc6.d 是软链接
/etc/rc.local 是软链接
/etc/system-release 是软链接
/etc/yum.conf 是软链接
[root@localhost ~/test]$
四、命名管道判定表达式:[ -p FILE ]
- 表达式说明:判定 FILE 存在并且是一个命名管道,表达式返回值 true
在Linux操作系统中,命名管道(Named Pipe)是一种特殊类型的文件,用于实现进程间的通信。它也被称为FIFO(First In First Out),因为它遵循先进先出的数据读取原则。
实例:评定给定的文件是否是命名管道文件。
#!/bin/bash
if [ -p "$1" ] ; then
echo "$1 这是一个命名管道。"
else
echo "$1 这不是一个命名管道。"
fi
- 创建一个命名管道文件:
[root@localhost ~/test]$mkfifo ispip01
[root@localhost ~/test]$
[root@localhost ~/test]$ls -l | grep ispip01
prw-r--r--. 1 root root 0 4月 5 20:02 ispip01
[root@localhost ~/test]$
- 运行脚本,查看运行结果:
[root@localhost ~/test]$./vartest26.sh ispip01
ispip01 这是一个命名管道。
[root@localhost ~/test]$
五、套接字判定表达式:[ -S FILE ]
- 表达式说明:判定 FILE 存在并且是一个套接字,表达式返回值 true
实例:判定给定文件是否是一个套接字文件。
#!/bin/bash
if [ -S "$1" ]; then
echo "$1 是一个套接字文件。"
else
echo "$1 不是一个套接字文件。"
fi
- 运行脚本检查/usr/lib/systemd/system/sshd.socket文件,显示运行结果:
[root@localhost ~/test]$./vartest27.sh /usr/lib/systemd/system/sshd.socket
/usr/lib/systemd/system/sshd.socket 不是一个套接字文件。
[root@localhost ~/test]$
- 运行脚本检查/run/systemd/journal/socket文件,显示运行结果:
[root@localhost ~/test]$./vartest27.sh /run/systemd/journal/socket
/run/systemd/journal/socket 是一个套接字文件。
[root@localhost ~/test]$
六、目录判定表达式:[ -d FILE ]
- 表达式说明:判定 FILE 存在并且是一个目录,表达式返回值 true
实例:判定给定一个文件是否是目录。
#!/bin/bash
for fname in /dev/*; do
if [ -d "$fname" ]; then
echo "$fname 是目录。"
fi
done
- 运行脚本,显示运行结果:
[root@localhost ~]$./vartest08.sh
/dev/block 是目录。
/dev/bsg 是目录。
/dev/bus 是目录。
/dev/char 是目录。
/dev/cpu 是目录。
/dev/disk 是目录。
/dev/dri 是目录。
七、广谱判定文件是否存在表达式:[ -e FILE ]
- 表达式说明:判定文件存在,适用所有文件,包括目录。表达式返回值 true
实例:判定一个文件或者目录是否存在。
[root@localhost ~]$cat varfile01.sh
#!/bin/bash
if [ -e "$1" ] ; then
echo "$1 文件存在。"
else
echo "$1 文件并不存在。"
fi
- 运行脚本,显示运行结果:
[root@localhost ~]$./varfile01.sh abc.sh
abc.sh 文件存在。
[root@localhost ~]$./varfile01.sh 456.sh
456.sh 文件并不存在。
[root@localhost ~]$
八、非目录文件的存在判定表达式:[ -f FILE ]
- 表达式说明:判定 FILE 存在,并且是一个非目录的常规文件,表达式返回值 true
实例:下面使用一个实例,用 for 循环遍历一个目录下所有文件,并列出目录下所有非目录非设备的常规文件。
[root@localhost ~]$cat varfile01.sh
#!/bin/bash
echo "使用 -f 参数查询目录:$1"
for fname in $1; do
if [ -f "$fname" ]; then
echo "$fname"
fi
done
- 运行脚本,显示运行结果(太多省略大部分结果):
[root@localhost ~]$./varfile01.sh /etc/\*
使用 -f 参数查询目录:/etc/*
/etc/adjtime
/etc/aliases
/etc/anacrontab
/etc/bashrc
/etc/bindresvport.blacklist
/etc/chrony.conf
/etc/chrony.keys
/etc/cron.allow
/etc/crontab
/etc/crypttab
九、判定文件大小大于零表达式:[ -s FILE ]
- 表达式说明:判定 FILE 存在且文件大小大于零,表达式返回值 true
实例:判定一个文件的大小是否大于零。
[root@localhost ~]$cat varfile05.sh
#!/bin/bash
if [ -e "$1" ] ; then
if [ -s "$1" ]; then
echo "文件存在,且有内容。"
else
echo "文件存在,但是大小为 0 。"
fi
else
echo "文件不存在!"
fi
- 准备两个文件 read.txt 和 zero.txt 用于测试:
[root@localhost ~]$ls -l | grep -E "read123.txt|read.txt|zero.txt"
-rw-r--r--. 1 root root 2273 3月 2 22:09 read.txt
-rw-r--r--. 1 root root 0 3月 31 00:01 zero.txt
[root@localhost ~]$
- 运行脚本检测不同的文件,显示运行结果:
[root@localhost ~]$./varfile05.sh read123.txt
文件不存在!
[root@localhost ~]$./varfile05.sh read.txt
文件存在,且有内容。
[root@localhost ~]$./varfile05.sh zero.txt
文件存在,但是文件大小为 0 。