一、Shell条件测试
1.数值比较[整数1 操作符 整数2]
操作符
-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
2.文件测试[操作符 文件或目录]
操作符
-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
3.字符串比较[“字符串”=“字符串”]
3.1 = 等于
需求:邀请用户确认,yes升级装备,no不升级装备
脚本:
read -p "您确定要升级这件装备吗?" select
if [ "$select" = "yes" ] 必须有双引号
then echo "装备升级开始。。”
else echo "感谢您欢迎下次光临”
fi
3.2 != 不等于
read -p "您确定要升级这件装备吗?" select
if [ "$select" != "yes" ] 必须有双引号
then echo "感谢您欢迎下次光临”
else echo "装备升级开始。。”
fi
3.3 -z -n
-z 判断字符长度是否为0
bbb=""
echo ${#bbb} | echo $?
-n 判断字符长度不是为0
[ -n "$bbb" ] ; echo $?
4.and和or
当条件测试比较复杂时,需要多个条件同时成立,就需要混合测试——>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
1.单分支结构
if [ command/test ] ; then 符合条件的语句
fi
例子:编写脚本,由用户输入用户名,如果用户不存在,则创建该用户,并设置密码为123456
read -p ”请输入用户名:“ name
id $name &> /dev/null
if [ $? -ne 0 ]
then useradd $name
fi
2.双分支结构
if 条件测试
then
命令序列
else
命令序列
fi
例子:编写脚本,由用户输入用户名,如果用户不存在,则创建该用户,并设置密码为123456
read -p ”请输入用户名:“ name
if id $name &> /dev/null
then echo "用户已经存在"
else useradd $name and echo "用户已经创建"
fi
3.多分支结构
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
4.嵌套结构
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