Linux下的Shell编程(欧拉篇六)test方括号命令的使用方法之标准输入输出状态与正则表达式的使用
文章目录
- 摘要:标准输入输出是否关联终端判定;使用正则表达式验证IP地址、使用正则表达式验证特定字符串、使用正则表达式验证email地址、使用正则表达式验证url地址、使用正则表达式验证日期格式。
判断标准输入输出是否连接到终端
标准输入输出是否连接终端的判定表达式:[ -t FD ]
- 表达式说明:通过文件描述符FD判断标准输入输出是否连接在终端上,表达式返回值 true
FD默认是如下三个值:0、1、2。这三个文件描述符默认分别被分配给标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。
实例:下面用一个非常简单的脚本来理解这个判断的工作原理。
#!/bin/bash
# 检查标准输入文件描述符 0 是否已经关联到终端:
if [ -t 0 ]; then
echo "标准输入已经连接到终端。"
else
echo "标准输入没有连接到终端。"
fi
# 检查标准输出文件描述符 1 是否已经关联到终端:
if [ -t 1 ]; then
echo "标准输出连接到终端。"
else
echo "标准输出没有连接到终端。"
fi
- 默认状态下标准输入和标准输出都连接在终端
[root@localhost ~/test]$./varfile02.sh
标准输入已经连接到终端。
标准输出连接到终端。
- 将标准输出重定向到文件,运行脚本:
[root@localhost ~]$./varfile02.sh > out01.txt
[root@localhost ~]$cat out01.txt
标准输入已经连接到终端。
标准输出没有连接到终端。
- 将标准输入重定向自文件,将标准输出重定向到文件,运行脚本:
[root@localhost ~]$./varfile02.sh < abc.sh > out02.txt
[root@localhost ~]$cat out02.txt
标准输入没有连接到终端。
标准输出没有连接到终端。
正则表达式匹配
使用正则表达式。
-
匹配正则表达式使用符号:“=~”
-
格式如下:[[ 变量 =~ 正则表达式 ]]
实例1:检查字符串是否匹配正则表达式;字符串规则:开头由Hello组成,后面接不限长度的数字。
#!/bin/bash
read -p "请输入字符串格式为Hello与数字组合:" string
if [[ $string =~ ^Hello[0-9]+$ ]]; then
echo "字符串匹配正则表达式。"
else
echo "字符串不匹配表达式。"
fi
- 运行局脚本,显示运行结果:
[root@localhost ~/test]$./regex01.sh
请输入字符串格式为Hello与数字组合:Hello546846546841654
字符串匹配正则表达式。
[root@localhost ~/test]$./regex01.sh
请输入字符串格式为Hello与数字组合:Helloksdkfsd6546465465465
字符串不匹配表达式。
实例2:检查归档文件名是否符合特定要求
#!/bin/bash
filename="archive-2024-04-10.tar.gz"
if [[ $filename =~ ^archive-[0-9]{4}-[0-9]{2}-[0-9]{2}\.tar\.gz$ ]]; then
echo "为归档创建的文件名字“符合”归档文件名字要求。"
else
echo "为归档创建的文件名字“不符合”归档文件名字要求。"
fi
- 运行脚本,显示脚本运行结果:
[root@localhost ~/test]$./regex02.sh
为归档创建的文件名字“符合”归档文件名字要求。
[root@localhost ~/test]$
实例3:验证录入的电子邮件地址格式。
#!/bin/bash
read -p "请输入你的email地址:" email
if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
echo "电子邮件地址有效。"
else
echo "电子邮件地址无效。"
fi
- 运行脚本,显示脚本运行结果:
[root@localhost test]# ./regex03.sh
请输入你的email地址:40725054@qq.com
电子邮件地址有效。
[root@localhost test]# ./regex03.sh
请输入你的email地址:admin_7548@sk_wd84.cn
电子邮件地址无效。
[root@localhost test]#
实例4:简单的检查IPv4地址格式是否合规。
- 注意:这种正则表达式只能进行格式检查,无法对地址规则进行检查,比如:300.300.300.300是无法辨别错误的。
#!/bin/bash
read -p "输入IPv4地址:" ip
if [[ $ip =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
echo "IP地址格式正确。"
else
echo "IP地址格式不正确。"
fi
- 运行脚本,显示脚本运行结果:
[root@localhost test]# ./regex04.sh
输入IPv4地址:183.1532.1.10
IP地址格式不正确。
[root@localhost test]# ./regex04.sh
输入IPv4地址:300.300.300.300
IP地址格式正确。
[root@localhost test]# ./regex04.sh
输入IPv4地址:10.30.0.251
IP地址格式正确。
实例5:检查URL格式是否正确。
#!/bin/bash
read -p "输入完整URL地址:" url
if [[ $url =~ ^(http|https)://([^/\s:]+)(:[0-9]+)?(/.*)?$ ]]; then
echo "URL 格式正确。"
else
echo "URL 格式错误。"
fi
- 运行脚本,显示脚本运行结果:
[root@localhost test]# ./regex05.sh
输入完整URL地址:https://www.baidu.com/abc?=4562354
URL 格式正确。
实例6:检查日期格式(YYYY-MM-DD)
#!/bin/bash
read -p "请以此格式输入日期(YYYY-MM-DD):" date
if [[ $date =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "日期格式正确。"
else
echo "日期格式错误。"
fi
- 运行脚本,显示脚本运行结果:
[root@localhost test]# ./regex06.sh
请以此格式输入日期(YYYY-MM-DD):2024-04-12
日期格式正确。
[root@localhost test]# ./regex06.sh
请以此格式输入日期(YYYY-MM-DD):20240412
日期格式错误。
[root@localhost test]# ./regex06.sh
请以此格式输入日期(YYYY-MM-DD):2024.04.12
日期格式错误。
[root@localhost test]# ./regex06.sh
请以此格式输入日期(YYYY-MM-DD):2024-4-12
日期格式错误。