目录
shell 数组详解
有这样一个现实问题:一个班级学员信息系统,要求存储学员ID、NAME、SCORE、AGE、GENDER,班级有50个人,思考如何解决交互中数据存储的问题。很多人可能直接说或定义变量接收数据不就行了!nice,你很棒!!
解决方案如下:
1)每个学生通过5个变量,一个班级50个学生,5*50=250,妥妥的!我定义250个变量接收就可以了,美美哒!
兄弟,现在不是全班了是全校的学生需要录入你这个信息系统,你写变量吧!!当我提出这个需求的时候,作为开发你会不会想骂娘呢?
2)使用数组来定义,我只需要定义5个数组来接收所有用户的数据就可以了,5个数组就能解决一切,你觉得你会不会想了解下数组是什么呢?
一、数组介绍
数组可以让用户一次赋予多个值,需要读取数据时只需通过索引调用就可以方便读出了。
普通数组:只能使用整数作为数组索引(元素的索引)
关联数组:可以使用字符串作为数组索引(元素的索引)
二、数组定义
数组名称=(元素1 元素2 元素3 ...)
三、数组赋值方式
- 一次附一个值
变量名=变量值
array[0]=v1
array[1]=v2
array[3]=v3
- 一次附多个值
array=(var1 var2 var3 var4)
array1=(`cat /etc/passwd`) //将文件中每一行赋值给array1数组
array2=(`ls /root`)
array3=(harry amy jack "Miss zhang")
array4=(1 2 3 4 "hello world" [10]=linux)
四、数组取值
取值方式: ${数组名称[索引]}
索引: 默认情况下索引是指数组中的元素[存的值]在数组中的顺序,从0开始计数,关联数组除外。比如:
array=(var1 var2 var3 var4)
array数组中存有4个元素,分别是:var1 var2 var3 var4
那么我想取出var2这个元素,那么就得先看看他在数组中的位置,数组中的元素索引如下:
元素 var1 var2 var3 var4
索引 0 1 2 3
所以正确表示array数组中元素var2的方式是:${array[1]}
数组取值练习
${array[i]} i表示元素的索引
使用@ 或 * 可以获取数组中的所有元素:
获取第一个元素
echo ${array[0]}
echo ${array[*]} 获取数组里的所有元素
echo ${#array[*]} 获取数组里所有元素个数
echo ${!array[@]} 获取数组元素的索引索引
echo ${array[@]:1:2} 访问指定的元素;1代表从索引为1的元素开始获取;2代表获取后面几个元素
五、关联数组
5.1 定义管理数组
关联数组使用首先需要申明该数组为关联数组,申明方式: declare -A 数组名称
首先声明关联数组
declare -A asso_array1
declare -A asso_array2
declare -A asso_array3
5.2关联数组赋值
- 一次赋一个值
数组名[索引]=变量值
[root@zutuanxue ~]# asso_array1[linux]=one
[root@zutuanxue ~]# asso_array1[java]=two
[root@zutuanxue ~]# asso_array1[php]=three
- 一次附多个值
[root@zutuanxue ~]# asso_array2=([name1]=harry [name2]=jack [name3]=amy [name4]="Miss zhang")
- 查看关联数组
[root@zutuanxue ~]# declare -A
declare -A asso_array1='([php]="three" [java]="two" [linux]="one" )'
declare -A asso_array2='([name3]="amy" [name2]="jack" [name1]="harry" [name4]="Miss zhang" )'
管理数组取值
[root@zutuanxue ~]# echo ${asso_array1[linux]}
one
[root@zutuanxue ~]# echo ${asso_array1[php]}
three
[root@zutuanxue ~]# echo ${asso_array1[*]}
three two one
[root@zutuanxue ~]# echo ${!asso_array1[*]}
php java linux
[root@zutuanxue ~]# echo ${#asso_array1[*]}
3
[root@zutuanxue ~]# echo ${#asso_array2[*]}
4
[root@zutuanxue ~]# echo ${!asso_array2[*]}
name3 name2 name1 name4
六、课堂练习
2.1 写一个监控CPU 平均负载值的脚本
案例需求
分别打印CPU 1min 5min 15min load负载值
案例思路
- 1、如何取CPU负载值,有哪些命令
- 2、如果存储在内存中,变量、数组
案例步骤
- 1、收集cpu load 平均负载值到数组
- 2、打印输出对应的负载值
代码实现
#!/bin/bash
#
#Author: www.zutuanxue.com
#
#Release:
#Description: 打印cpu 1min 5min 15min的负载值
#1、收集负载值
cpu_load=(`uptime|tr -s " "|cut -d " " -f9-11|tr "," " "`)
#2、输出负载值
echo "CPU 1 min平均负载为: ${cpu_load[0]}"
echo "CPU 5 min平均负载为: ${cpu_load[1]}"
echo "CPU 15 min平均负载为: ${cpu_load[2]}"
代码效果
[root@zutuanxue day2]# sh cpu_load.sh
CPU 1 min平均负载为: 0.00
CPU 5 min平均负载为: 0.01
CPU 15 min平均负载为: 0.05
shell流程控制-if判断语句
一、if介绍
如何写一个高可用性的脚本,赋予脚本智能化,赋予脚本执行逻辑。
比如nginx安装脚本中
- configure执行成功在执行make,
- make执行成功在执行make install
- 上一步错误就不需要执行后面的代码了。
answer: 加入判断
只要你想在代码中判断一下的时候就第一时间想到if就行了,适用于99%的语言。
当我们在写程序的时候,时常对上一步执行是否成功如何判断苦恼,当我们今天学习了if就可以解决你的苦恼。if语句在我们程序中就是用来做判断的,以后大家不管学习什么语言,以后只要涉及到判断的部分,大家就可以直接拿if来使用,不同的语言之间的if只是语法不同,原理是相同的。
二、单if语法
适用范围:只需要一步判断,条件返回真干什么。
语句格式
if [ condition ] #condition 值为true or false
then #条件为真的时候执行
commands #代码块 一行或者多行代码
fi #语句的结束
该语句翻译成汉语大意如下:
假如 条件为真
那么
执行commands代码块
结束
通过一段代码来演示一下吧,判断 当前用户是不是root,如果不是那么返回”ERROR: need to be root so that!“
#!/bin/bash
#Author: www.zutuanxue.com
#Created Time:
#Script Description:
if [ $USER != 'root' ]
then
echo "ERROR: need to be root so that"
exit 1
fi
三、if…else语句
适用范围==:两步判断,条件为真干什么,条件为假干什么。
if [ condition ]
then 条件为真
commands1 真 要执行代码块
else 条件为假
commands2 假 要执行的代码块
fi 结束
该语句翻译成汉语大意如下:
假如条件为真
那么
执行commands1代码块
否则
执行commands2代码块
结束
通过一段代码演示一下吧,判断当前登录用户是管理员还是普通用户,如果是管理员输出”hey admin“ 如果是普通用户输出”hey guest“
#!/bin/bash
#Author:www.zutuanxue.com
#Created Time:
#Script Description:
if [ $USER == 'root' ]
then
echo "hey admin"
else
echo "hey guest"
fi
四、if…elif…else
适用范围:多于两个以上的判断结果,也就是多于一个以上的判断条件。
if [ condition 1] 满足第一个条件
then 真
command1 执行command1代码块
elif [ condition 2] 满足第二个条件
then 真
commands2 执行command2代码块
.......
else 如果条件都不满足
commandsX 执行commandX代码块
fi 结束判断
该语句翻译成汉语大意如下:
假如 条件1 为真
那么
执行代码块1
假如 条件2 为真
那么
执行代码块2
以此类推的N个条件及对应的执行代码块
否则 【以上所有条件中没有一个满足的】
执行代码块X
结束
通过一段代码演示一下吧,通过一个脚本,判断两个整数的关系
案例需求
判断内存的使用率
60以下 ok
60以上 黄色警告
70以上 橙色严重警告
80以上 红色警告
案例思考
- 内存使用率获得方式
– 手动给出
– 通过内存查看命令运算得出
案例代码
#!/bin/bash
#1、条件
#判断内存的使用率
#60以下 ok 绿色 32m
#60以上 黄色警告 33m
#70以上 粉色严重警告 35m
#80以上 红色警告 31m
#2、算法
#收集内存使用率 $1
#
#多条件判断
if [ $1 -gt 80 ]
then
echo -e "\033[31m 警告 \033[0m"
elif [ $1 -gt 70 ]
then
echo -e "\033[35m 警告 \033[0m"
elif [ $1 -gt 60 ]
then
echo -e "\033[33m 警告 \033[0m"
else
echo -e "\033[32m OK \033[0m"
fi
#注意事项
#多条件判断 需要从最严格开始判断 否者 后面的就不会生效
#如果你第一个判断的是60以上,那么 70 80 都符合第一个条件。所以后面的判断70 80 就没有任何意义
五、练习案例
案例需求
比较两个整数的关系
案例思考
- 两个整数有几种关系
– 大于
– 等于
– 小于
案例代码
#!/bin/bash
#Author: www.zutuanxue.com
#Created Time:
#Script Description:
if [ $1 -gt $2 ]
then
echo "$1 > $2"
elif [ $1 -eq $2 ]
then
echo "$1 = $2"
else
echo "$1 < $2"
fi
六、if嵌套if
当有多步判断的时候,可以使用if嵌套
1、多步判断 类似于多条件if
2、依赖执行的环境 configure->make->make install
6.1、使用if嵌套if的方式判断两个整数的关系
#!/bin/bash
#Author:
#Created Time:
#Script Description:
if [ $1 -ne $2 ]
then
if [ $1 -gt $2 ]
then
echo " $1 > $2 "
else
echo " $1 < $2 "
fi
else
echo " $1 = $2 "
fi
6.2、写一个nginx安装初始化脚本
案例需求
写一个nginx业务初始化脚本,完成nginx软件自动安装。
案例思考
- 1、nginx软件包获得方式
- 2、nginx安装流程
- 3、nginx安装依赖关系
案例步骤
- 1、软件包下载
- 2、软件包解压
- 3、安装依赖包
- 4、安装nginx
- 5、返回结果
案例代码
#!/bin/bash
#Author: www.zutuanxue.com
#Created Time:
#Script Description: nginx aoto install script
source_pkg=nginx-1.19.2.tar.gz
#1、软件包下载
wget http://nginx.org/download/$source_pkg
#2、解压
if [ -f $source_pkg ];then
tar xf $source_pkg && cd nginx-1.19.2
else
echo "not found $source_pkg"
exit 1
fi
#3、安装依赖包
if ! ( yum -y install pcre-devel zlib-devel );then
echo "yum: install soft error"
exit 1
fi
#4、配置
#判断配置语句执行结果
if ./configure 1>/dev/null
then
#判断make执行结果
if make 1>/dev/null
then
#判断make install安装结果
if make install 1>/dev/null
then
echo "nginx 安装成功"
else
echo "nginx 安装失败"
exit 1
fi
else
echo "make fail"
exit 1
fi
else
echo "configure fail"
exit 1
fi
#./configure
#if [ $? -eq 0 ];then
#注意: 1>/dev/null
1 标准输出
2 标准错误输出
七、if高级用法
7.1、条件符号使用双圆括号,可以在条件中植入数学表达式 if (())
#!/bin/bash
#Author:
#Created Time:
#Script Description:
if (( (5+5-5)*5/5 > 10 ))
then
echo "yes"
else
echo "no"
fi
7.2、使用双方括号,可以在条件中使用通配符
通过代码看下 ,为字符串提供高级功能,模式匹配 r* 匹配r开头的字符串
#!/bin/bash
#Author:
#Created Time:
#Script Description:
for var in ab ac rx bx rvv vt
do
if [[ "$var" == r* ]]
then
echo "$var"
fi
done
八、简写if
省去了关键字,条件为真采用&&符号链接命令块,条件为假采用||链接命令块
简写if一般用在简单的判断中
if [ ! -d /tmp/baism ]
then
mkdir /tmp/baism
fi
可以简写为
[ ! -d /tmp/baism ] && mkdir /tmp/baism
if [ $USER == 'root' ]
then
echo "hello root"
else
echo "hello guest"
fi
可以简写
[ $USER == 'root' ]&&echo "hello root" || echo "hello guest"
if语句与shell运算
if是一个条件判断语句,判断的前提是得有个条件。so,条件就显得格外重要了,if中可以有哪些条件呢?接下来我们就来聊一聊if条件的问题。
我们在之前的课程中学习了shell的运算,有比较运算、逻辑运算、文件运算等,这些运算可以植入到if条件中吗?答案是肯定的,接下来我就给大家演示一下如何在if条件中植入shell运算条件
一、与文件存在与否的判断
-e 是否存在 不管是文件还是目录,只要存在,条件就成立
-f 是否为普通文件
-d 是否为目录
-S socket
-p pipe
-c character
-b block
-L 软link
- 文件权限相关的判断
-r 当前用户对其是否可读
-w 当前用户对其是否可写
-x 当前用户对其是否可执行
-u 是否有suid
-g 是否sgid
-k 是否有t位
- 两个文件的比较判断
file1 -nt file2 比较file1是否比file2新
file1 -ot file2 比较file1是否比file2旧
file1 -ef file2 比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode
- 整数之间的判断
-eq 相等
-ne 不等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
浮点比较运算
比较两个浮点数字的大小
给脚本两个浮点数字 返回他两的关系
#思路
1、获得两个浮点数字
2、处理为整形
3、比较
4、输出
- 字符串之间的判断
-z 是否为空字符串 字符串长度为0,就成立
-n 是否为非空字符串 只要字符串非空,就是成立
string1 == string2 是否相等
string1 != string2 不等
#用户登录验证
[root@zutuanxue ~]# cat if-6.sh
#!/bin/bash
#1、交互式输入用户名 密码
read -p "user: " myuser
if [ -z "$myuser" ];then
echo "用户名为空"
exit 1
fi
#从外往里写
read -p "password: " mypw
if [ -n "$mypw" ];then
#2、判断是否正确
#2.1 判断用户名
if [ $myuser == "root" ];then
#2.2判断密码
if [ $mypw == "abc-123" ];then
echo "welcome root"
else
echo "密码错误"
exit 1
fi
else
echo "用户名错误"
exit 1
fi
else
echo "密码不能为空"
exit 1
fi
- 多重条件判断
逻辑判断符号:
&& (and 逻辑与) 两个条件同时满足,整个大条件为真
|| (or 逻辑或) 两个条件满足任意一个,整个大条件为真
! 非运算
#用户登录验证
[root@zutuanxue ~]# cat if-6.sh
#!/bin/bash
#1、交互式输入用户名 密码
read -p "user: " myuser
if [ -z "$myuser" ];then
echo "用户名为空"
exit 1
fi
#从外往里写
read -p "password: " mypw
if [ -n "$mypw" ];then
#2、判断是否正确
#2.1 判断用户名
#if [ $myuser == "root" ];then
#2.2判断密码
# if [ $mypw == "abc-123" ];then
# echo "welcome root"
#else
# echo "密码错误"
# exit 1
# fi
#
#else
# echo "用户名错误"
# exit 1
#fi
if [ $myuser == 'root' ] && [ $mypw == 'abc-123' ];then
echo "welcome root"
else
echo "用户名或密码错误"
exit 1
fi
else
echo "密码不能为空"
exit 1
fi
if高级用法
一、if高级用法
1.1、条件符号使用双圆括号,可以在条件中植入数学表达式 if (())
#!/bin/bash
#Author: www.zutuanxue.com
#Created Time:
#Script Description:
if (( (5+5-5)*5/5 > 10 ))
then
echo "yes"
else
echo "no"
fi
1.2、使用双方括号,可以在条件中使用通配符
通过代码看下 ,为字符串提供高级功能,模式匹配 r* 匹配r开头的字符串
#!/bin/bash
#Author: www.zutuanxue.com
#Created Time:
#Script Description:
for var in ab ac rx bx rvv vt
do
if [[ "$var" == r* ]]
then
echo "$var"
fi
done
二、简写if
省去了关键字,条件为真采用&&符号链接命令块,条件为假采用||链接命令块
简写if一般用在简单的判断中
if [ ! -d /tmp/baism ]
then
mkdir /tmp/baism
fi
可以简写为
[ ! -d /tmp/baism ] && mkdir /tmp/baism
if [ $USER == 'root' ]
then
echo "hello root"
else
echo "hello guest"
fi
可以简写
[ $USER == 'root' ]&&echo "hello root" || echo "hello guest"
流程控制-for循环语句
工作中总是有很多工作需要重复性来完成,比如每天都需要执行一次备份、每天都需要分析一次业务的access.log日志,每分钟都需要监测一次主机的状态等等工作,这些重复性的工作我们一般都是使用脚本来完成,对于不需要频繁执行的任务,可以结合计划任务➕脚本完成,但是系统的计划任务只能精确到分,不能满足更频繁的重复工作。
这个时候我们除了依赖计划任务之外还有很多选择,比如脚本中的循环语句。
循环的优点
- 1)节省内存 10M脚本 1M脚本 哪个更剩内存 完成同一个任务
- 2)结构更清晰
- 3)节省开发时间成本
一、循环语句-for
1.1、for介绍
脚本在执行任务的时候,总会遇到需要循环执行的时候,比如说我们需要脚本每隔五分钟执行一次ping的操作,除了计划任务,我们还可以使用脚本来完成,那么我们就用到了循环语句。
1.2、for基本语法 for条件循环
- 列表for循环:用于将一组命令执行已知的次数,下面给出了for循环语句的基本格式:
for variable_name in {list}
do
command
command
…
done
或者
for variable in a b c
do
command
command
done
1.3、for条件应用
for条件不同的赋值方式
a、赋值来自一个范围
for var in {1..10}
do
echo $var
done
b、直接赋值
for var in 1 2 3 4 5
do
echo $var
done
c、赋值来自命令
for var in `seq 10`
do
echo $var
done
体验不同的方式
赋值来自一个范围
for var in $(seq 10)
do
echo $var
done
for var in {0..10..2}
do
echo $var
done
for var in {10..1}
do
echo $var
done
for var in {10..1..-2}
do
echo $var
done
for var in `seq 10 -2 1`
do
echo $var
done
- 不带列表循环
不带列表的for循环执行时由用户指定参数和参数的个数,下面给出了不带列表的for循环的基本格式:
for variable
do
command
command
…
done
语法结构举例说明:
#!/bin/bash
for var
do
echo $var
done
echo "脚本后面有$#个参数"
1.4、for C格式语法
- 类C风格的for循环
for(( expr1;expr2;expr3 ))
do
command
command
…
done
for (( i=1;i<=5;i++))
do
echo $i
done
expr1:定义变量并赋初值 变量初始值
expr2:决定是否进行循环(条件) 变量的条件
expr3:决定循环变量如何改变,决定循环什么时候退出 自增或自减运算
多变量用法
for ((A=1,B=10;A<10,B>1;A++,B--))
语法结构举例说明:
for ((i=1;i<=5;i++));do echo $i;done
for ((i=1;i<=10;i+=2));do echo $i;done
for ((i=2;i<=10;i+=2));do echo $i;done
二、练习案例
jobs: 写一个扫描软件,扫描本地网络中存活的机器
案例需求:
判断本地网络中哪些IP被使用
案例分析:
采用ping的方式判断IP是否被占用
a、能ping通说明占用
b、不能ping通说明未被占用
b、命令
ping -c1 IP
算法:
1、ping ip
2、分析ping结果
3、输出结果
#!/bin/bash
#
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description: 扫描本地网络中存活的主机,以C类地址为例
#variables
netsub="192.168.1."
#main
#1、循环ping IP地址,能ping通说明IP存在。
for ip in `seq 1 254`
do
(
#2、判断Ping结果
if ping -c1 $netsub$ip &>/dev/null;then
#3、输出结果
echo "$netsub$ip is open"
else
echo "$netsub$ip is close"
fi
) &
done
循环控制语句
阅读 (3396)
分享
一、循环控制-break语句
作用: 终止循环,执行循环体后面的代码
案例:
循环打印输出数字1到9,当执行输出到5时终止循环。
要求输出:
1
2
3
4
执行完毕
案例代码
#!/bin/bash
#Author: www.zutuanxue.com
#Created Time:
#Script Description:
for i in `seq 1 9`
do
echo $i
if [ $i -eq 5 ]
then
break
fi
done
echo "执行完毕"
二、循环控制-continue语句
作用: 跳过某次循环,继续执行下一次循环;表示循环体内下面的代码不执行,重新开始下一次循环
案例:
循环打印输出数字1到9,当执行输出到5时跳过本次循环。
要求输出:
1
2
3
4
6
7
8
9
执行完毕
案例代码
#!/bin/bash
#Author: www.zutuanxue.com
#Created Time:
#Script Description:
for ((i=1;i<10;i++))
do
if [ $i -eq 5 ]
then
continue
else
echo $i
fi
done
echo "执行完毕"
三、循环控制-sleep
作用: 控制循环的节奏,控制循环频率
当执行一个无限循环语句的时候,如果任意其循环那么该循环就会疯狂的消耗计算机的内存和CPU资源,消耗最大的就是CPU,所以一个循环不可能让其肆意循环,必须控制其循环的节奏,可以使用sleep语句来完成。
案例:
写一个倒计时程序:从9到1,每秒倒数一次。
案例代码
#!/bin/bash
#Author:
#Created Time:
#Script Description:
echo -n "倒计时: "
for i in `seq 9 -1 1`
do
echo -n -e "\b$i"
sleep 1
done
echo
echo "执行完毕"
四、参数控制命令-shift
作用: 外部传参到循环时,参数管理命令
使位置参数向左移动,默认移动1位,可以使用shift 2 传参要是N的整数倍
案例:
通过外部传参的方式向脚本内的循环传递参数,要求打印每次循环使用的参数。
案例代码
#!/bin/bash
#
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description:
#1、判断外传参的数量
[ $# -lt 3 ]&&echo '请输入至少三个参数:'$0' $1 $2 $3 ...'&&exit 1
#将参数的数量赋值给count
count=$#
#通过shift左移参数输出
#使位置参数向左移动,默认移动1位,可以使用shift 2 传参要是N的整数倍
for ((i=1;i<=$count;i++))
do
echo '参数数量: '$#''
echo '当前$1的数值是: '$1''
shift 1
sleep 1
done
echo "执行完毕"
五、脚本退出命令-exit
作用: 退出程序并释放占用的系统资源
案例:
循环输出数字1-9,当循环到5时退出脚本。
案例代码
#!/bin/bash
#Author: www.zutuanxue.com
#Created Time:
#Script Description:
for i in `seq 1 9`
do
echo $i
if [ $i -eq 5 ]
then
exit 0
fi
done
echo "执行完毕"
for嵌套
阅读 (3230)
分享
一、for嵌套
1.1、for嵌套if
案例:
输出1-9,当输出5时停止输出
案例代码
#!/bin/bash
#
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description:输出1-9,当输出5时停止输出
for ((num=1;num<10;num++))
do
echo $num
[ $num -eq 5 ]&& break
done
1.2、for嵌套for
案例:
打印99乘法表
案例代码
#!/bin/bash
#
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description:
#打印99乘法表,思考A*B的关系
for ((A=1;A<=9;A++))
do
for ((B=1;B<=$A;B++))
do
echo -n -e "$B*$A=$((A*B)) \t"
done
#换行
echo
done
二、for与数组
for循环与数组
2.1、使用for循环遍历读出数组
name=('tom' 'jarry' 'harry' 'barry')
for i in 0 1 2 3
do
echo ${name[$i]}
done
2.2、使用for循环进行数组存值
for i in `seq 0 9`
do
read -p "name: " name[$i]
done
流程控制-while循环
阅读 (3826)
分享
while在shell中也是负责循环的语句,和for一样。因为功能一样,很多人在学习和工作中的脚本遇到循环到底该使用for还是while呢?很多人不知道,就造就了有人一遇到循环就是for或者一位的while。我个人认为可以按照我说的这个思想来使用,既知道循环次数就可以用for,比如说一天需要循环24次;如果不知道代码要循环多少次,那就用while,比如我们作业中要求写的猜数字,每个人猜对一个数字的次数都是不能固定的,也是未知的。所以这样的循环我就建议大家用while了。
一、while介绍
**特点:**条件为真就进入循环;条件为假就退出循环,一般应用在未知循环次数的环境。
1.1、while语法
while [ 表达式 ]
do
command...
done
while [ 1 -eq 1 ] 或者 (( 1 > 2 ))
do
command
command
...
done
案例
使用for循环和while循环分别循环打印数组1-5
案例代码
for循环打印:
for ((i=1;i<=5;i++))
do
echo $i
done
while循环打印:
#打印数字1-5
#!/bin/bash
#
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description: 打印1-5
num=1
while [ $num -le 5 ]
do
echo $num
let num++
done
备注: 知道循环次数就可以用for,比如说一天需要循环24次;如果不知道代码要循环多少次,那就用while,比如我们作业中要求写的猜数字,每个人猜对一个数字的次数都是不能固定的,也是未知的。
二、while与shell运算
2.1、比较运算
案例:
循环交互输入一个小写字母,按Q退出循环
案例代码
#按Q退出场景
#!/bin/bash
#
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description:
read -p "请输入一个小写字母,按Q退出: " choose
while [ $choose != 'Q' ]
do
echo "你输入的是: $choose"
read -p "请输入一个小写字母,按Q退出: " choose
done
2.2、逻辑运算
案例:
使用循环语句帮助丈母娘批量选择女婿
案例代码
#!/bin/bash
#
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description:
#丈母娘选女婿 分别按照姑娘20 30 40 进行与或非模拟
#1.第一个应征者回答
read -p "你有多少钱: " money
read -p "你有多少车: " car
read -p "你家房子有几套: " house
#while [ $money -lt 10000 ]&&[ $car -lt 1 ]&&[ $house -lt 2 ]
while [ $money -lt 10000 ]||[ $car -lt 1 ]||[ $house -lt 2 ]
do
#应征者不满住条件开始下一次循环
echo "有请下一个"
read -p "你有多少钱: " money
read -p "你有多少车: " car
read -p "你家房子有几套: " house
done
#应征者满足条件
echo "乖女婿,你怎么才来啊!女儿给你了"
2.3、文件类型判断
案例:
使用循环判断/tmp/xxx目录下的文件,如果不是文件类型的打印字符串"目录"
案例代码
文件类型判断
#!/bin/bash
#
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description:
while [ ! -f /tmp/xxx ]
do
echo “目录”
sleep 1
done
2.4、特殊条件
while语句中可以使用特殊条件来进行循环:
- 符号":" 条件代表真,适用与无限循环
- 字符串 “true” 条件代表真,适用与无限循环
- 字符串 "false"条件代表假
代码展示
特殊符号 : 代表真
#!/bin/bash
#
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description:
while :
do
echo haha
sleep 1
done
true 字符串代表真,和:类似
#!/bin/bash
#
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description:
while true
do
echo haha
sleep 1
done
false 字符串代表假,在while中不会开始循环
三、while与循环控制语句
3.1、sleep语句
#!/bin/bash
#
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description: 倒计时游戏
#1.定义初始值
time=9
#2.循环输出,1秒一次
while [ $time -ge 0 ]
do
echo -n -e "\b$time"
let time--
#控制循环 1秒一次
sleep 1
done
#回车
echo
3.2、break
#!/bin/bash
#
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description: 输出数字1-9,当输出5时停止
#1、定义初始值
num=1
while [ $num -lt 10 ]
do
echo $num
#判断当前num的值,如果等于5就跳出循环
if [ $num -eq 5 ]
then
break
fi
#自动累加
let num++
done
3.3、continue
#!/bin/bash
#
#Author:
#Created Time:
#Release:
#Description: 输出数字1-9,当等于5时跳过本次循环,输出1、2、3、4、6、7、8、9
#1、定义初始值
num=0
while [ $num -lt 9 ]
do
#自动累加
let num++
#判断当前num的值,如果等于5就跳过本次循环
if [ $num -eq 5 ]
then
continue
fi
#输出num的值
echo $num
done
四、while嵌套其他语句
4.1、while嵌套if
#!/bin/bash
#
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description: 输出数字1-9,当输出5时停止
#1、定义初始值
num=1
while [ $num -lt 10 ]
do
echo $num
#判断当前num的值,如果等于5就跳出循环
if [ $num -eq 5 ]
then
break
fi
#自动累加
let num++
done
4.2、while嵌套for
#!/bin/bash
#
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description: 99乘法表
A=1
while [ $A -lt 10 ]
do
for ((B=1;B<=$A;B++))
do
echo -n -e "$B*$A=$((A*B)) \t"
done
echo
let A++
done
4.3、while嵌套while
#!/bin/bash
#
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description: 99乘法表
#定义A
A=1
while [ $A -lt 10 ]
do
#定义B
B=1
while [ $B -le $A ]
do
echo -n -e "$B*$A=$((A*B)) \t"
let B++
done
echo
let A++
done
流程控制-until语句
阅读 (1877)
分享
一、循环语句-until
系统中还有一个类似while的循环语句,大家可以看看until语句,不同于while的是,当条件为假时开始until循环。
1.1、until介绍
特点:条件为假就进入循环;条件为真就退出循环
1.2、until语法
until expression [ 1 -eq 1 ] (( 1 >= 1 ))
do
command
command
...
done
二、案例:
使用while循环和until循环打印数字接龙,要求while循环输出1-5,until循环输出6-9.
案例代码
#!/bin/bash
#
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description: 数字接龙
i=1
while [ $i -le 5 ]
do
echo $i
let i++
until [ $i -le 5 ]
do
echo $i
let i++
[ $i -eq 10 ]&&break
done
done
f [ $num -eq 5 ]
then
continue
fi
#输出num的值
echo $num
done
## 四、while嵌套其他语句
### 4.1、while嵌套if
#!/bin/bash
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description: 输出数字1-9,当输出5时停止
#1、定义初始值
num=1
while [ $num -lt 10 ]
do
echo $num
#判断当前num的值,如果等于5就跳出循环
if [ $num -eq 5 ]
then
break
fi
#自动累加
let num++
done
### 4.2、while嵌套for
#!/bin/bash
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description: 99乘法表
A=1
while [
A
−
l
t
10
]
d
o
f
o
r
(
(
B
=
1
;
B
<
=
A -lt 10 ] do for ((B=1;B<=
A−lt10]dofor((B=1;B<=A;B++))
do
echo -n -e “
B
∗
B*
B∗A=$((A*B)) \t”
done
echo
let A++
done
### 4.3、while嵌套while
#!/bin/bash
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description: 99乘法表
#定义A
A=1
while [ $A -lt 10 ]
do
#定义B
B=1
while [ $B -le
A
]
d
o
e
c
h
o
−
n
−
e
"
A ] do echo -n -e "
A]doecho−n−e"B*
A
=
A=
A=((A*B)) \t"
let B++
done
echo
let A++
done
# 流程控制-until语句
阅读 (1877)
分享
## 一、循环语句-until
系统中还有一个类似while的循环语句,大家可以看看until语句,不同于while的是,当条件为假时开始until循环。
### 1.1、until介绍
特点:条件为假就进入循环;条件为真就退出循环
### 1.2、until语法
until expression [ 1 -eq 1 ] (( 1 >= 1 ))
do
command
command
…
done
## 二、案例:
使用while循环和until循环打印数字接龙,要求while循环输出1-5,until循环输出6-9.
**案例代码**
#!/bin/bash
#Author: www.zutuanxue.com
#Created Time:
#Release:
#Description: 数字接龙
i=1
while [ $i -le 5 ]
do
echo $i
let i++
until [ $i -le 5 ]
do
echo $i
let i++
[ $i -eq 10 ]&&break
done
done