Linux下的Shell编程(欧拉篇四)test方括号命令的使用方法之检测文件是否存在和检测文件的类型

本文详细介绍了Linux下Shell编程中利用test方括号命令检测文件是否存在、类型(块设备、字符设备、软链接、命名管道、套接字等)、非目录文件以及文件大小的方法,通过实例演示了如何在脚本中使用这些表达式来检查文件状态。
摘要由CSDN通过智能技术生成

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  45 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  32 22:09 read.txt
-rw-r--r--. 1 root root     0  331 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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m976382

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值