1 test
test 条件
 条件为真返回 0,条件为假返回 1
 [ 条件 ]
 test 能够理解3种类型的表达式
 1.文件测试
 2.字符串比较
 3.数字比较
文件测试
| -f | 存在且是普通文件 | 
| -d | 存在且是目录 | 
| -h | 存在且是符号链接 | 
| -b | 块设备 | 
| -c | 字符设备 | 
| -e | 文件存在 | 
字符串
| -n STRING | 字符串长度不为零 | 
| -z STRING | 字符串长度为0 | 
| = | 判断两个字符串是否一样 | 
| STRING1 = STRING2 | |
| != | 判断两个字符串是否不一样 | 
| STRING1 != STRING2 | 
数字
| eq | 等于 | ne | 不等于 | 
| ge | 大于等于 | le | 小于等于 | 
| gt | 大于 | lt | 小于 | 
2 if语句
流控制:
•在一个shell脚本中的命令执行顺序称作脚本的流。大多数脚本会根据一个或多个条件来改变它们的流。
•流控制命令:能让脚本的流根据条件而改变的命令称为条件流控制命令
•exit语句:退出程序的执行,并返回一个返回码,返回码为0正常退出,非0为非正常退出,例如:
•exit 0
条件判断
If代码返回0表示真,非0为假
 if语句语法如下: 1
if [ $1 -eq 1 ];thenecho '等于1'
elif [ $1 -eq 2 ];thenecho '等于二'
elseecho '既不等一,也不等于二'
fi
练习(选做):
1)检测apache是否运行,如果没有运行则启动,并记录启动的时间,保存到日志中。
#!/bin/bash
systemctl stop nginx
systemctl status httpd | grep Active |awk '{print $2}'
if [ "$status" = "active" ]
thenecho "apache 是启动的 "
elsesystemctl start httpd && date >> /root/apache_start.logecho "apache 已启动"
fi3 case
case 语句是 shell 中流控制的第二种方式,语法如下:
read -p "case" var
case $var in模式1)list1;; 模式2)list2;; 模式N)listN;;*)list*;; 
esac
命令;;表明流应该跳转到case语句的最后。
4 for循环
for i in {取值范围}    # for 关键字  i 变量名 in 关键字  取值范围格式 1 2 3 4 5do                    # do 循环体的开始循环体done                  # done 循环体的结束
for循环批量创建用户
#!/bin/bash 
while :     #死循环
do
read -p "请设置用户前缀/数量/密码: " prefix num pass 
cat <<-EOF                 # 打印到屏幕
用户前缀:$prefix
用户数量:$num
用户密码:$pass
EOF
read -p "是否确认创建:[Y/N]" action 
if [ $action = Y ];thenecho "starting create users..." break
fi
done
for i in `seq -w $num`
douser=$prefix$iid $user &>/dev/null if [ $? -eq 0 ];thenecho "$user  is already exist"elseuseradd $userecho $pass | passwd --stdin $user &>/dev/null  # 用户密码设置不需要交互fi 
done
5 while
while 条件    # while 关键字  条件  [ $1 -lt 10 ] ,while循环,条件为真的情况下,会循环
do循环体
done