shell条件测试
语法格式
test 条件表达式 -d(判断目录) -e(判断文件和目录) -f(文件)
[ 条件表达式 ]
[[ 条件表达式 ]]
数值比较[ 整数 操作符 整数 ]
[ ] 准备做测试符
操作符 也是数值比较的操作符
-gt 大于
-lt 小于
-eq 等于
-ne 不等于
-ge 大于等于
-le 小于等于
例如:[ 12 -gt 32 ] ; echo $?
1 #说明上一条命令是错的12不大于32
文件测试[ 测试符 文件或目录 ]
测试符 参数
[ -f 1.txt ] ;echo $? 指定检测是文件并存在返真
[ -b 1.txt ] ;echo $? 指定检测是块文件并存在时返真
[ -d 1.txt ] ;echo $? 指定检测是目录并存在时返真
[ -h 1.txt ] ;echo $? 指定检测是符号链接文件并存在时返真
[ -c 1.txt ] ;echo $? 指定检测是字符文件时并存在返真
[ -e 1.txt ] ; echo $? 指定检测是文件或目录时并存在返真
[ -g 1.txt ] ;echo $? 指定检测是文件或目录并设置了SGID位时返真 (g+s权限)
[ -k 1.txt ] ;echo $? 指定检测是文件或目录并设置了“粘滞位”时返真 (o+t权限)
[ -p 1.txt ] ;echo $? 指定检测是命名管道并存在时返真
[ -r 1.txt ] ;echo $? 指定检测文件或目录存在可读时返真 (针对的是当前用户,不能是root)
[ -w 1.txt ] ;echo $? 指定检测文件或目录存在可写时返真(针对的是当前用户,不能是root)
[ -x 1.txt ] ;echo $?指定检测文件或目录存在可执行时返真(针对的是当前用户,不能是root)
[ -s 1.txt ] ; echo $? 指定检测文件大于0并存在时返真
[ -S 1.txt ] ; echo $? 指定检测文件是套接字文件(socket)并存在时返真
[ -O 1.txt ];echo $? 指定检查当前用户是否为指定文件的所有者
[ -G 1.txt ];echo $? 指定检查当前用户是否属于拥有指定文件的组
字符串测试 [ 字符串 = 字符串 ]
字符串 提示使用弱引号
= 等于
例如
read -p "您确定要升级这件装备吗?" select if [ "$select" = "yes" ] then echo "装备升级开始。。。" else echo "感谢您,欢迎下次光临。" fi
!= 不等于
例如
read -p "您确定要升级这件装备吗?" select if [ "$select" != no" ] then echo "装备升级开始。。。" else echo "感谢您,欢迎下次光临。" fi
echo ${#ll} #号表示统计变量的字符个数
参数
[ -z "$ll" ] ;echo $? 制定监测变量的字符数为0时返真
[ -n "$ll" ] ;echo $? 制定监测变量的字符数不为0时返真
and or
and =&&= -a 条件全部成立才可以
or =||= -o 条件瞒足一个就可以
测试时如果里面有特殊符号时用[[ ]]双中括号
比如:
[[ 1 -lt 2 && 40 -gt 10 ]] ;echo $? #1小于2 并且40大于10时返真
[ ${#li} -ge 7 ] && [[ ${li=~ a-z } ]] &&[[ ${li=~ A-Z } ]] #脚本用法
if
结果一共为两个值时可以用 if [ $? -ne 0 ];then 来测试
then #当条件成立以后做下面的命令
单分支
if开头 fi 结尾
例如:
#!/bin/bash read -p "请输入您要创建的用户名:" name #收集变量 id $name &> /dev/null #测试变量 if [ $? -ne 0 ]; then #上一条命令结果不为真那么执行下面的操作 useradd $name #创建用户 echo "$name 创建成功" #提示
双分支
if条件测试成功 做then下面的命令 if条件测试失败做else下面的命令
例如:
#!/bin/bash read -p "请输入您要创建的用户名:" name #收集变量 id $name &> /dev/null #测试变量 if [ $? -ne 0 ]; then #上一条命令结果不为真那么执行下面的操作 useradd $name #创建用户 echo "$name 创建成功" #提示 else #上一天条命令结果为真执行下面的操作 echo "用户已经存在" # 提示 fi #结尾
if 后面跟 id $name ; then 前面没有[ ]检测符命令的话 then 捕捉的只能是正确的 else只能是错误的
例如:
read -p "请输入您要创建的用户名:" name
if id $name &>/dev/null ;then
echo "用户已经存在"
else
useradd $name
echo "123" | passwd --stdin $name &> /dev/null
echo "$name 用户创建成功 , 密码为123"
fi
多分支
elif
elif应用 例如:
hour=`date +%H`
if [ $hour -ge 6 -a $hour -lt 10 ];then
echo "早上好"
elif [ $hour -ge 10 -a $hour -lt 13 ];then
echo "中午好"
elif [ $hour -ge 13 -a $hour -lt 18 ];then
echo "下午好"
else
echo "晚上好"
fi
if的嵌套结构
嵌套结构运用
#!/bin/bash
read -p "请输入新的用户:" name
id $name &>/dev/null
if [ $? -eq 0 ];then
echo "$name 用户已经存在"
read -p "是否删除$name用户[yes/no]:" seslct
if [ $seslct = yes ];then
userdel -r $name
echo "$name 用户已经删除"
else
echo "用户未删除"
fi
else read -p "请输入新用户的密码:" pass
if [ ${#pass} -ge 7 ];then
useradd $name
echo "$pass" | passwd --stdin $name &> /dev/null
echo "$name 用户创建成功,密码是$pass"
else
echo "用户密码不足7位数,创建用户失败"
fi
fi
调试脚本
sh -x 1.sh 这将该脚本并显示所有变量的值
sh -n 1.sh 仅调试脚本中的语法错误。
例如:脚本出错
sh -vx 1.sh 以调试的方式执行,查询整个执行过程
例如:脚本出错提醒
模式匹配 case
简单的模式匹配
用户无论如何回答都可以叫脚本捕捉
标准模式
下面写一个case和if嵌套的案例
#!/bin/bash
read -p "请输入需要创建的用户名:" name
id $name &> /dev/null
if [ $? -eq 0 ];then
echo "$name 用户已经存在"
read -p "是否删除$name 用户[y/n]" pp
case $pp in
yes|YES|Yes|YEs|yES|yEs|yeS|YeS|y|Y)
userdel -r $name &> /dev/null
echo "$name 用户已删除"
;;
*)
echo "$name 用户取消删除"
;;
esac
else
read -p "请确认是否创建用户为$name [y/n]" pppp
case $pppp in
yes|YES|Yes|YEs|yES|yEs|yeS|YeS|y|Y)
read -p "请输入7位数密码:" pass
if [ ${#pass} -ge 7 ];then
useradd $name &> /dev/null
echo "$name 用户创建成功,密码为$pass"
else
echo "$name 用户创建失败" fi
;;
*)
echo "很遗憾$name 用户创建失败"
;;
esac
fi
简单的jumpserver
跳板主机 跳板脚本 一台服务器管理多台服务器 运行脚本直接转跳
变量名=变量值
cat<<EOF
1.变量名
2.变量名... ...
read -p "请选择要管理的服务器:" 变量
case 变量 in
)
ssh 用户名 @$变量名
;;
*)
;;
esac
案例:
#!/bin/bash
wbe="192.168.72.150"
cat <<EOF
1.wbe
EOF
read -p "请用户选择要转跳的服务器:" pp
case $pp in
1)
ssh root@$wbe
;;
*)
echo "没有该服务器,拜拜"
exit
;;
esac
系统管理工具箱
h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
案例:
#!/bin/bash
#注意后面的是命令,尽量不要写进脚本不然不美观
cat << EOF
f 显示磁盘分区 fdisk -l lsblk gdisk -l
d 显示磁盘挂载 df -Th
m 查看内存使用 free -m
u 查看系统负载 uptime
q 退出程序 exit
EOF
read -p "请选择:" kkk
case $kkk in
f)
lsblk
;;
d)
df -Th
;;
... ...
*)
;;
esac
在这里给大家一个说一下、下一个文档的写的是循环
给大家一个循环的脚本(一个整蛊的小脚本)
#!/bin/bash
read -p "请输入您的姓名:" name
while :
do
read -p "请问你是傻子吗?" shi
if [ $shi = 是 ] ;then
echo "大傻子 $name 再见"
exit 666
else
echo "输入错误,请重新输入"
fi
done