测试语法
1.test表达式
test 1 -lt 2
2,[ 条件表达式 ]
最常用
[ 1 -lt 2 ]
3.[[ 条件表达式 ]]
[[ 1 -lt 2 ]]
数值比较
-gt 大于
-lt 小于
-eq 等于
-ne 不等于
-ge 大于等于
-le 小于等于
[ 20 -gt 10 ]
[ 1 -lt 10 ]
[ 1 -eq 1 ]
[ 1 -ne 10 ]
[ 20 -ge 10 ]
[ 10 -le 10 ]
echo $?
#用来查看上条命令执行结果
0 正确
1,2..其他 错误
例子
-
猜测用户输入的密码,是否满足长度需求
-
read -p "请输入您的密码:" ps if [ ${#ps} -lt 7 ] then echo "您的密码太短!" else echo "您的密码真长!" fi
文件测试------(文件是否存在)
- 常见
-f filename : 当filename 存在时返回真 -b filename : 当filename 存在并且是块文件时返回真(返回0) -d pathname : 当pathname 存在并且是一个目录时返回真 -h filename : 当filename 存在并且是符号链接文件时返回真 (或 -L filename) -c filename : 当filename 存在并且是字符文件时返回真 -e pathname : 当由pathname 指定的文件或目录存在时返回真 -g pathname : 当由pathname 指定的文件或目录存在并且设置了SGID 位时返回真 -k pathname : 当由pathname 指定的文件或目录存在并且设置了"粘滞"位时返回真 -p filename : 当filename 存在并且是命名管道时返回真 -r pathname : 当由pathname 指定的文件或目录存在并且可读时返回真 -s filename : 当filename 存在并且文件大小大于0 时返回真 -S filename : 当filename 存在并且是socket 时返回真 -w pathname : 当由pathname 指定的文件或目录存在并且可写时返回真 -x pathname : 当由pathname 指定的文件或目录存在并且可执行时返回真 -O pathname : 当由pathname 存在并且被当前进程的有效用户id 的用户拥有时返回真(字母O 大写) -G pathname : 当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真
示例
-
[ -f 1.txt ] #1.txt文件是否存在 [ -e /root/file.sh ] #该路径或该路径下的文件存在 [ -w /root/1.sh ] #该路径下的文件是否可写
-
请用户输入备份的路径, 如果存在提示已存在可以备份,如果不存在提示目录不存在请创建。
-
read -p "请您输入备份的目录:" dir1 if [ -d $dir1 ] then echo "$dir1 存在可以备份" else echo "$dir1 不存在无法备份" fi
字符串比较
[ "asdada"="dasdada" ]
= 等于
!= 不等于
-z 判断字符长度是为0
-n 判断字符长度不是0
例子
-
邀请用户确认,yes升级装备,no不升级装备
-
read -p "您确定要升级这件装备吗?" select if [ "$select" = "yes" ] then echo "装备升级开始。。。" else echo "感谢您,欢迎下次光临。" fi
and和or
-
&& 逻辑的 AND 的意思, -a ,两个条件同时成立,为真。
-
|| 逻辑的 OR 的意思, -o ,两个条件一个成立,为真。
例子
-
猜测用户输入的密码是否满足如下条件 1.长度大于等于7位 2.包含字母大写 3.包含字母小写 4.包含符号“@!_”
read -p "请您输入新密码: " pass
if [ ${#pass} -gt 7 ] && [[ ${pass} =~ [a-z] ]] && [[ ${pass} =~ [A-Z] ]] && [[ ${pass} =~ [@_!] ]]
then echo "您的密码真复杂!!!"
else echo "您的密码太简单!!!"
fi
[root@localhost ~]# [ 1 -lt 2 -a 5 -gt 10 ]
1小于2和5大于10
[root@localhost ~]# [ 1 -lt 2 -o 5 -gt 10 ]
1小于2或5大于10
[root@localhost ~]# [[ 1 -lt 2 && 5 -gt 10 ]]
1小于2和5大于10
[root@localhost ~]# [[ 1 -lt 2 || 5 -gt 10 ]]
1小于2且5大于10
[root@localhost ~]# [ 1 -lt 2 ] && [ 11 -gt 10 ]
1小于2和11大于10
if
示例1
if [ 1 -lt 2 ];then
command1
command2
fi
-
编写脚本,由用户输入用户名,如果用户不存在,则创建该用户
-
#!/bin/bash read -p "Input username: " name id $name &> /dev/null if [ $? -ne 0 ]; then useradd $name fi
示例2
-
if [ 1 -lt 2 ];then command1 else command2 fi
-
编写脚本,由用户输入用户名, 如果用户不存在,则创建该用户,并设置密码为123456; 否则,提示用户已经存在
-
#!/bin/bash read -p "Input username: " name id $name &> /dev/null if [ $? -ne 0 ] ;then echo "$name already exist" else useradd $name echo "123456" | passwd --stdin $name &> /dev/null echo "$name create finished,the password is 123456" fi
示例3
-
if [ 1 -lt 2 ];then command1 elief [ 1 -lt 2 ];then command2 else command3 fi
-
编写脚本,取出系统时间的小时,对数字进行判断 6--10 this is morning 11-13 this is noon 14-18 this is afternoon 其他 this is night
-
#!/bin/bash hour=`date +%H` if [ $hour -ge 6 -a $hour -le 10 ];then echo "This is morning" elif [ $hour -ge 11 -a $hour -le 13 ];then echo "This is noon" elif [ $hour -ge 14 -a $hour -le 18 ];then echo "This is afternoon" else echo "This is night" fi
示例4
-
read -p "Input username: " name id $name &> /dev/null if [ $? -eq 0 ];then echo "$name 存在" else useradd $name echo "$name create finished" # echo "123456" | passwd --stdin $name &> /dev/null read -p "请输入用户密码: " pass if [ ${#pass} -ge 7 ];then #${3pass}获取变量长度 echo "$pass" | passwd --stdin $name echo "$name 用户密码是 $pass" else echo "密码不合格" fi fi
注意
-
1、[ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格
-
2、在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。
-
3、注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n "$var" ]如果var为空会出错
-
4、判断是不支持浮点值的
-
5、如果只单独使用>或者<号,系统会认为是输出或者输入重定向,虽然结果显示正确,但是其实是错误的,因此要对这些符号进行转意
-
6、默认,运行if语句中的命令,所产生的错误信息。仍然出现在脚本的输出结果中
-
7、使用-z或者-n来检查长度的时候,没有定义的变量也为0
-
8、空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用-n或者-z测试一下
-
9、$? 变量包含了之前执行命令的退出状态(最近完成的前台进程)(可以用于检测退出状态)
case
案例1
case $name in
1|2|3|4)
command1
;;
5|6|7)
command2
;;
*)
command3
;;
esac
邀请用户输入待删除用户名。 询问用户,确定要继续删除吗 yes/no: " y
#!/bin/bash
#name
#time
#1请输入删除的用户名:
read -p "please input a username : " user
#2请用户确认是否删除
read -p "确认删除吗?[yes/no] " action
#3 case 流控写法
case "$action" in
Y|y|YES|yes|Yes|YeS|YEs)
userdel -r $user
echo "$user is deleted!"
;;
*)
echo "thank you"
;;
esac
案例2
-
跳板主机,运行跳板脚本。弹出数十台服务器名的菜单 1)mysql1 2)mysql2 3)bj-web1 ........ h) help q) exit 用户请选择要连接的主机[1-3]: 1 Last login: Sun Sep 6 04:18:01 2023 from 192.168.122.1 [root@localhost ~]$连接成功!!!
-
#!/usr/bin/bash #定义目标主机IP web1=192.168.122.152 web2=192.168.122.128 mysql1=192.168.122.88 #打印跳转菜单 cat <<EOF 1.WEB1 2.WEB2 3.MYSQL1 EOF #读取用户输入 read -p "input number: " num #判断用户选择 case $num in 1) ssh alice@$web1 ;; 2) ssh alice@$web2 ;; *) echo '123' esac
案例3
-
系统管理工具箱
-
Command action h 显示命令帮助 f 显示磁盘分区 d 显示磁盘挂载 m 查看内存使用 u 查看系统负载 q 退出程序
-
#!/usr/bin/bash #打印菜单 cat <<-EOF h. help f. disk partation d. filesystem mount m. memory u. system load q.exit EOF # 读取用户输入,进行模式匹配 read -p "please input [h for help]: " action case "$action" in f) fdisk -l ;; d) df -hT ;; m) free -m ;; u) uptime ;; q) exit ;; "") ;; *) echo "error" ;; esac