操作符
-gt | 大于 |
-lt | 小于 |
-eq | 等于 |
-ne | 不等于 |
-ge | 大于等于 |
-le | 小于等于 |
echo ${#pass} 变量长度
测试语法 必须有空格
1.test条件表达式 test 2 -ge 7 | echo $?
2.[条件表达式] [ 2 -ge 7 ] | echo $?
3.[[条件表达式]] [[ 2 -ge 7 ]] | echo $?
if语法结构
if 如果
then 那么
else 否则
fi 结束
实例
1.需求:猜测用户输入的密码,是否满足长度要求
2.脚本
vim pass.sh
read -p "请输入您的密码,是否满足长度“ ps
if [ ${#ps} -lt 7 ]
then
echo "您的密码太短"
else
echo "您的密码太长"
fi
3,测试 bash pass.sh
操作符
-f filename | 当filename 存在时返回真 |
-b filename | 当filename存在并且是块文件时返回真(返回0) |
-d pathname | 当pathname存在并且是一个目录时返回真 |
-h filename | 当filename存在并且是符号链接文件时返回真 或 - Lfilename |
-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时返回真 |
-t fd | 当fd 是与终端设备相关联的文件描述符时返回真 |
-W pathname | 当由pathname 指定的文件或目录存在并且可写时返回真 |
-X pathname | 当由pathname指定的文件或目录存在并日可执行时返回真 |
-O pathname | 当由pathname存在并且被当前进程的有效用户id的用户拥有时返回真(字母O大写) |
-G pathname | 当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真 |
实例
1.需求:当用户输入备份的路径,如果存在提示已存在可以备份,如果不存在目录提示请创建
2.脚本
vim path.sh
#!/bin/bash
read -p "请输入您要备份的目录:" dir1
if [ -d $dir1 ]
then echo "$dir1存在可以备份"
else echo "$dir1不存在不可以备份"
fi
或 test -d /abc ; echo $?
3.测试
chmod +x /path.sh
bash path.sh
需求:邀请用户确认,yes升级装备,no不升级装备
脚本:
read -p "您确定要升级这件装备吗?" select
if [ "$select" = "yes" ] 必须有双引号
then echo "装备升级开始。。”
else echo "感谢您欢迎下次光临”
fi
read -p "您确定要升级这件装备吗?" select
if [ "$select" != "yes" ] 必须有双引号
then echo "感谢您欢迎下次光临”
else echo "装备升级开始。。”
fi
-z 判断字符长度是否为0
bbb=""
echo ${#bbb} | echo $?
-n 判断字符长度不是为0
[ -n "$bbb" ] ; echo $?
当条件测试比较复杂时,需要多个条件同时成立,就需要混合测试——>and和or
&& 逻辑and的意思 -a,两个条件同时成立为真
|| 逻辑 or的意思 -o,两个条件一个成立为真
需求:用户输入的密码必须满足以下条件
1.长度大于等于7
2.包含小写字母
3.包含大写
4.包含符号“@_!
read -p "请您输入密码:" pass
if [ ${#pass} -ge 7 ] && [[ ${pass} =~ [a-z] ]] && [[ ${pass} =~ [A-Z] ]] && [[ ${pass} =~ [@_!] ]]
then echo "sucess”
else echo "error”
fi
~ 模糊查询 用的时候必须要加[[
[[ 2 -le 5 -a 9 -le 8]]
[[ 2 -le 5 -o 9 -le 8]]
[[ 2 -le 5 && 9 -le 8]]
[[ 2 -le 5 || 9 -le 8]]
if [ command/test ] ; then 符合条件的语句
fi
例子:编写脚本,由用户输入用户名,如果用户不存在,则创建该用户,并设置密码为123456
read -p ”请输入用户名:“ name
id $name &> /dev/null
if [ $? -ne 0 ]
then useradd $name
fi
if 条件测试
then
命令序列
else
命令序列
fi
例子:编写脚本,由用户输入用户名,如果用户不存在,则创建该用户,并设置密码为123456
read -p ”请输入用户名:“ name
if id $name &> /dev/null
then echo "用户已经存在"
else useradd $name and echo "用户已经创建"
fi
if 条件测试
then 命令序列
elif 条件测试
then 命令序列
elif 条件测试
then 命令序列
elif 条件测试
then 命令序列
...................
else
命令序列
fi
案例:编写脚本:取出系统时间,并对数字进行判断6-10morning 11-13 noon 14-18afternoon 其他night
hour=`date +%H` date后有空格,没有报错,取时针的数
echo $hour
if [ $hour -ge 6 -a $hour -le 10 ]
then
echo "it is moring"
elif [ $hour -ge 11 -a $hour -le 13 ]
then echo "it is noon"
elif [ $hour -ge 14 -a $hour -le 18 ]
then echo "it is afternoon"
else
echo "it is night"
fi
if 条件测试 then 命令序列
if 条件测试 then 命令序列
else 命令序列
fi
else 命令序列
fi
#!/bin/bash
read -p "input username:" name
if id $name &> /dev/null
then
echo "$name exit"
else
useradd $name
echo "$name create finished"read -p "please input user password :" pass
if [ ${#pass} -ge 7 ]
then echo "$pass" | passwd --stdin $name #--stdin从标准输入读取令牌(只有根用户才能进行此操作)
echo "$name user password $pass"
else echo "password not good"
fi
fi
调试脚本的其他方法
sh -n 02.sh 仅调试脚本中的语法错误
sh -vx 02.sh 以调试的方法执行,查询整个执行过程
- []表示条件测试,注意这里的空格,要注意在“[后边”和“]”前边都必须有空格
- 在shell里,then和fi是分开的语句,如果在同一行输入,则需要用分号将他们隔开
- 注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[-n "$var"],如果var为空会出错
- 判断是不支持浮点数的,
- 如果只单独使用>或者<,系统会认为时输入或输出重定向,虽然结果显示正确,但其实是错误的,因此要对这些符号进行转意
- 默认,运行if语句中的命令,所产生的错误信息,仍然出现在脚本的输出结果中
- 使用-z或者-n来检查长度时,没有定义的变量也为0
- 空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试前使用-n,或-z测试一下
- $?变量包含了之前执行命令的退出状态(最近完成的前台进程,可用于检测退出状态)
shell编程中if和case都是用来做流控的
简单的模式匹配:邀请用户输入带删除的用户名,询问用户,确实要继续删除吗yes/no
if写法
#!/bin/bash
read -p "input delete userName:" name
read -p "select isnot delete user(yes or no):" select
if [[ "$select" = "yes" ]]
then userdel $name;echo "delete $name success"
elif [[ "$select" = "no" ]]
then echo "no delete $name"
else echo "erorr select"
fi
case语法结构
case 变量 in
模式1)
命令序列1
模式2)
命令序列2
模式3)
命令序列3
*)
无匹配命令后序列
esac
userdel -r "$name"
echo "delete user success";;
*)
echo "thank you";;
esac
需求:由于工作中,我们需要管理N台服务器,那么访问服务器就是一件繁琐的事,通过shell编程,编写跳板程序,当我们需要访问服务器时,看一眼服务器列表名,按一下数字,就登录成功,岂不美哉
跳板主机,运行跳板脚本,弹出数十台服务器名的菜单
#!/bin/bash
web1=192.168.64.2
web2=192.168.64.3
mysql1=192.168.64.4
docker=192.168.64.5
k8s=192.168.64.6#dayincaidan
cat <please select login service number:
1.login web1 service
2.login web2 service
3.login mysql service
4.login docker service
5.login k8s service
6.renyijian exit
EOF
read -p "please select service number:" num
case $num in
1)
ssh root@$web1
;;
2)
ssh root@$web2
;;
3)
ssh root@$mysql1
;;
4)
ssh root@$docker
;;
5)
ssh root@$k8s
;;
*)
echo "thank you"
exit
esac
前言:Liunx提供的丰富的管理命令,用户管理,内存管理,磁盘管理,进程管理,日志管理,文件管理,软件管理,网络管理等等数十个工具包。如果你能通过shell编程,把他们编到一个程序中,想用某些功能,只需要按回车,就能完成,岂不美哉。
#!/bin/bash
cat <please select use tool:
h.help information
f.disk information
d.file system mount info
m.neicun info
u.system fuzai info
y.guazaidianxinxi
q.exit tool box
EOF
read -p "please input select tool number:" num
case $num in
h)
echo "qingshuruzimujinrugongjuxiang,ru:shuru "f" chakancipanxinxi"
;;
f)
fdisk -l
;;
d)
mount -a
;;
m)
free -m
;;
u)
uptime
;;
y)
df -hT
echo "----------------------------------"
read -p "chaxun guazai dian xinxi,chakan dulifenqu ,an Y tuichu:" select
if [ -n $select ]
then
df -hT | grep $select
fi
;;
q)
echo "thank you"
exit
;;
esac