暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【学习】Shell编程基础(流程控制)

唤我三郎便可 2021-08-20
474


流程程控语句

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论