
流程程控语句
1.1 什么是流程控制语句
说明:可以控制程序执行顺序的语句
1.2 为什么学习流程控制语句
1. 需要判断条件成立则执行指定语句
2. 能快速遍历列表
3. ....
1.2 流程控制语句分类
1. 条件分支控制语句
2. 条件循环控制语句
2. 条件分支控制语句
说明:条件满足则执行语句
条件分支控制语句 分类
1. if..else..
2. if..elif..
3. case..
2.1 if..else..条件分支
说明:如果条件成立,则执行then后面语句,否则执行else后面语句
格式:
if [ 条件 ]
then
语句块
else
语句块
fi
提示:
1. []中括号在shell中表示为表达式,表达式前后必须有空格;如[ 1 -gt 0 ]
2. 条件中有变量或字符串使用""括起来
3. then可以和if语句写在一行,then语句之前需要天添加; 如:if [ 条件 ];then
4. 结尾有关键字fi
练习1
说明:判断/root目录是否为空
提示:
== 为:判断字符串是否相等
!= 为:判断字符串不相等
扩展:
目录为动态输入
字符串比较 其他符号
| 序号 | 操作符 | 含义 |
|---|---|---|
| 1 | == | 是否相等 |
| 2 | != | 不等于 |
| 3 | -z | 字符串为空 |
| 4 | -n | 字符串不为空 |
练习2
说明:判断用户名和密码是否为admin 123456是的显示登陆成功,否则显示登陆失败;
练习2 难点分析
1. 条件1 与 条件2 相连的逻辑运算符
2. 字符与逻辑运算符之间要用“空格”分开
逻辑运算符
| 序号 | 表达 | 说明 |
|---|---|---|
| 1 | -a [and] | 且 |
| 2 | -o [or] | 或 |
| 3 | ! | 非 |
练习3
说明:输入数字,判断是否大于0,如果大于0则将该数-1并输出,否则+1输出
练习3 难点分析
1. 数字比较运算符[-eq、-ne、-gt、-ge、-lg、-le]
2. 数字变量操作需要使用()或[]括起来;如:((i++))、((i+=1)) i=$[$i+1] let i++ i=$(($i+1))
(let 计算命令;如:let a=2+3,b=10-4;let i++)
数字比较 其他符号
| 序号 | 符号 | 说明 |
|---|---|---|
| 1 | -eq [equal] | 等于 |
| 2 | -ne [no equal] | 不等于 |
| 3 | -gt [greate then] | 大于 |
| 4 | -ge [greate equal] | 大于等于 |
| 5 | -lt [less than] | 小于 |
| 6 | -le [less equal] | 小于等于 |
单括号与双括号
| 序号 | 括号 | 说明 |
|---|---|---|
| 1 | () | 1.命令组->在子shell中执行 如:(ls) 2. 命令替换->name=$(ls) 相当于name=`ls`【重点】 3.初始化数组->array=(1 2 3) |
| 2 | (()) | 1.整型计算->不能计算浮点型(小数) echo $((100-30)) 2.重定义变量值-> i=1;((i++))【重点】 |
| 3 | [] | 1.表达式-字符串比较运算符 -> ==和!=;不能比较整数,整数需要使用-lt..-gt;不能直接使用大于>和小于<,如果需要使用需要添加转义字符\ 如 \> 2. 表达式计算 --> i=$[$i+1] 【掌握】 |
| 4 | [[]] | 与[]相同,但允许直接出现逻辑符号 如:==、!=、&&、||、<、> --> [[ $a != 1 && $a != 2 ]]【重点】 |
| 5 | {} | 1. 文件列表进行拓展 -> 如 touch {test01,test02}.sh 2.标准变量输出; -> 读取变量使用 如:"${name}" 【掌握】 |
练习3 代码示例
#!/bin/bash
read -p "请输入数字:" num
if [ "${num}" -gt 0 ]
then
# ((num++))
# ((num+=1))
# num=$[ $num+1 ]
# num=$(($num+1))
let num++
echo "${num}"
else
# ((num--))
# ((num-=1))
# num=$[ $num-1 ]
# num=$(($num-1))
let num--
echo "${num}"
fi
练习4
说明:判断用户输入的目录是否存在,如果存在则统计目录下的文件个数,否则提示用户该目录不存在
练习4 难点分析
1. 判断目录是否存在 if test -d 参数
2. 统计文件个数 ls-l |wc -l
test命令:
1). test命令是shell环境中测试条件表达式的实用工具。
2). if后跟test命令,不使用[]
逻辑判断-文件
| 序号 | 参数 格式 | 说明 |
|---|---|---|
| 1 | -e filename | 文件是否存在,存在为真,不存在为假 |
| 2 | -d filename | 判断是否存在且为目录 |
| 3 | -f filename | 判断是否为普通文件 |
| 4 | -r filename | 是否存在且可读 |
| 5 | -w filename | 是否存在且可写 |
| 6 | -x filename | 是否存在且可执行 |
练习4 总结
#!/bin/bash
# 提示用户输入
read -p "请输入文件目录:" str
# 判断文件是否存在且为目录
if test -d "${str}"
then
filenum=$(ls -l ${str}|wc -l)
echo "${str}目录文件个数为:${filenum}"
else
echo "$str目录不存在!"
fi
2.2 if..elif..条件分支
说明:如果条件成立,那么 then 后边的语句将会被执行;否则,执行 else 后边的语句
格式:
if [ 条件 ]
then
语句块
elif [ 条件 ]
then
语句块
...
else
语句块
fi
练习5
说明:判断学生的成绩,90-100之间提示优秀,80-90之间提示良好,70-80之间提示一般,60-70之间提示及格,
其他则提示不及格;
练习5 代码示例
#!/bin/bash
# 提示用户输入成绩
read -p "请输入成绩:" score
if [ "${score}" -ge 90 -a "${score}" -le 100 ]
then
echo "成绩:${score} 优秀!"
elif [ "${score}" -ge 80 -a "${score}" -lt 90 ]
then
echo "成绩:${score} 良好!"
elif [ "${score}" -ge 70 -a "${score}" -lt 80 ]
then
echo "成绩:${score} 一般!"
elif [ "${score}" -ge 60 -a "${score}" -lt 70 ]
then
echo "成绩:${score} 及格!"
else
echo "成绩:${score} 不及格!"
fi
练习6
说明:判断用户输入的内容是否为空,为空则提示,不为空则判断是否为目录,不为目录则判断是否为文件,
否则提示输入错误;
练习6 代码示例
#!/bin/bash
# 提示用户输入文件名
read -p "请且输入要检测的文件名称:" file
# 判断是否为空,-z判断字符串长度是否为0
if [ -z "${file}" ]
then
echo "文件名不能为空!"
elif [ -d "${file}" ]
then
echo "${file}是目录!"
elif [ -f "${file}" ]
then
echo "${file}是文件!"
else
echo "输入错误!"
fi
2.3 case条件分支
条件符合执行相应的代码块,类似于if..elif..语句
格式:
case 变量 in
值1 )
echo "语句块1"
;;
值2 )
echo "语句块2"
;;
值3 | 值4 )
echo "语句块3"
;;
...
* )
echo "语句块4-默认值"
;;
esac
提示:
1. 星号(*)相当于else,条件都不符合时执行;
2. 双分号(;;)是必须的,执行完相应语句块跳出程序;
3. 竖线(|)用于分割多个值,相当于 值1 or 值2 ;
4. 值可以为字符串、数字、区间值( [0-9] | [a-z] | [A-Z] )、组合词[aA][bB][cC]
4. 结尾必须有esac
练习7
说明:请输入购物券种类:A:10元体验卷 B:满100减40 C:1折狂抢卷 D:刷脸免单卷
练习7 代码示例
#!/bin/bash
# 用户输入
read -p "请输入优惠卷类型:" ticket
case "${ticket}" in
A )
echo "10元体验卷!"
;;
B )
echo "满100-40!"
;;
C )
echo "1折狂抢卷!"
;;
D )
echo "刷脸面单卷!"
;;
* )
echo "对不起没有优惠!"
esac
3. 循环控制语句
说明:条件满足则循环,不满足则退出循环
循环控制语句 分类
1. for循环语句
2. while循环语句
3.1. for循环语句
遍历读取列表元素,列表元素遍历完毕,结束语句;
语法格式:
for 值 in 列表
do
执行语句
done
练习8
使用for循环打印1-10之间的数;
练习8 难点分析
1. 1-10之间的数 for i in $(req 1 10)
提示:
1. req命令作用:产生从某个数到另外一个数之间的所有整数,并且可以对整数的格式、宽度、分割符号进行控制
2. 格式
[1] seq [选项] 最大数
[2] seq [选项] 最小数 最大数
[3] seq [选项] 最小数 步长 最大数
3. 选项
-f, --format=格式 seq -f "user%03g" 1 20
(%g为默认位数,%3g为3位数不够3为使用空格,%03g不足部分用0代替)
-s, --使用指定的字符串分割(默认使用回车分割) seq -s" " -f"str%03g" 9 11
-w, --sequal-width 在列前添加0 使得宽度相同 seq -w 3 12
练习8 代码示例
#!/bin/bash
for i in $(seq 10)
do
echo "$i"
done
练习9
需求:打印当前用户下所有文件名称
练习9 操作分析
1. 查看当前用户下所有文件命令 --> ls root
2. 新建脚本文件 --> for.sh
3. 使用for循环 --> for i in $(ls root)
4. 执行test01.sh
练习9 代码示例
for.sh
#!/bin/bash
for i in $(ls root)
do
echo "当前用户下文件有:${i}"
done
提示:$(ls root) 为命令变量 或`ls root`
3.2 while 循环语句
说明:只要条件满足,就一直循环
语法格式
while [ 条件 ]
do
执行语句
done
提示:
1. 条件的类型:命令、字符串表达式、数字表达式
2. 中括号内前后有空格
练习10
说明:使用while循环求1-100之间的和
练习10 难点分析
1. 变量间加减运算 s=$((s+i))
2. 变量自加 ((i++))
练习10 代码示例
#!/bin/bash
num=1
sum=0
while [ $num -le 100 ]
do
sum=$((sum+num))
((num++))
done
echo "${sum}"
总结
1. if..else..
2. if..elif..
3. case
4. for
5. while



自己搜集总结


文章转载自唤我三郎便可,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




