一.if判断
单分支结构
语法:
if [ command/test ] ; then
符合该条件执行的语句 fi
例:
#!/bin/bash
# 提示用户输入用户名
read -p "Input username: " name
# 检查用户是否存在,将输出重定向到 /dev/null
id $name &> /dev/null
# 如果用户不存在(返回值不为0),则创建新用户
if [ $? -ne 0 ]; then
useradd $name
fi
双分支结构
语法:
if 条件测试 或 if 条件测试 ;then
then 命令序列
命令序列 else
else 命令序列
命令序列 fi
fi
#这里的区别就是如果关键字不换行,那么需要在关键字的前面加分号
例:
#!/bin/bash
# 提示用户输入用户名
read -p "Input username: " name
# 检查用户是否存在,将输出重定向到 /dev/null
if id $name &> /dev/null; then
# 如果用户存在,则输出用户已存在信息
echo "$name already exist"
else
# 如果用户不存在,则创建新用户并设置密码为123456
useradd $name
echo "123456" | passwd --stdin $name &> /dev/null
# 输出用户创建完成信息和密码
echo "$name create finished, the password is 123456"
fi
多分支结构
语法:
if 条件测试1
then 命令序列
elif 条件测试2
then 命令序列
elif 条件测试3
then 命令序列...
else 命令序列
fi
例:
#!/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
嵌套结构
语法:
if 条件测试1 then 命令序列
if 条件测试1 then 命令序列
else 命令序列
fi
else 命令序列
fi
例:
#!/bin/bash
# 提示用户输入用户名
read -p "Input username: " name
# 检查用户是否存在,将输出重定向到 /dev/null
id $name &> /dev/null
# 如果用户存在(返回值为0),则输出用户存在信息
if [ $? -eq 0 ];then
echo "$name 存在"
# 如果用户不存在(返回值不为0),则创建新用户并设置密码
else
# 创建新用户
useradd $name
# 输出创建完成信息
echo "$name create finished"
# 提示用户输入密码
read -p "请输入用户密码: " pass
# 检查密码长度是否大于等于7
if [ ${#pass} -ge 7 ];then
# 设置用户密码
echo "$pass" | passwd --stdin $name
# 输出用户密码信息
echo "$name 用户密码是 $pass"
# 如果密码长度小于7,则输出密码不合格信息
else
echo "密码不合格"
fi
fi
注意:
- [ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格
- 在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。
- 注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n "$var" ]如果var为空会出错
- 判断是不支持浮点值的
- 如果只单独使用>或者<号,系统会认为是输出或者输入重定向,虽然结果显示正确,但是其实是错误的,因此要对这些符号进行转意
- 默认,运行if语句中的命令,所产生的错误信息。仍然出现在脚本的输出结果中
- 使用-z或者-n来检查长度的时候,没有定义的变量也为0
- 空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用-n或者-z测试一下
- $? 变量包含了之前执行命令的退出状态(最近完成的前台进程)(可以用于检测退出状态)
二.模式匹配case
语法:
case 变量 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
模式3)
命令序列3
;;
*)
无匹配后命令序列
;;
esac
例1:
#!/bin/bash
echo "请输入一个数字(1-4):"
read num
case $num in
1)
echo "你选择了数字 1."
;;
2)
echo "你选择了数字 2."
;;
3)
echo "你选择了数字 3."
;;
4)
echo "你选择了数字 4."
;;
*)
echo "无效的数字,请输入 1-4 之间的数字。"
;;
esac
在这个示例中,脚本首先提示用户输入一个数字,然后使用read
命令读取用户的输入并将其存储在变量num
中。接下来,case
语句根据用户输入的数字执行相应的命令。如果用户输入了不在1-4范围内的数字,那么就会弹出 *)对应的内容,这个代表用户输入了其他内容的匹配项,一般用来做输入错误提示。
例2:
#!/bin/bash
# 提示用户输入要删除的用户名
read -p "please input a username : " user
# 提示用户确认是否删除
read -p "确认删除吗?[yes/no] " action
# 根据用户的确认操作进行相应的处理
case "$action" in
Y|y|YES|yes|Yes|YeS|YEs)
# 如果用户确认删除,则执行删除操作并输出删除成功信息
userdel -r $user
echo "$user is deleted!"
;;
*)
# 如果用户不确认删除,则输出感谢信息
echo "thank you"
;;
esac
在这里例子中,用户输入Y ,y , yes 等等都会执行同一语句,在设定这样的操作时,只需按例2使用 | 分割开即可。