shell 数组以及循环结构

50 篇文章 3 订阅
15 篇文章 0 订阅

目录

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			   #语句的结束

流程判断11.png

该语句翻译成汉语大意如下:

假如  条件为真
 那么
    执行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         		结束

流程判断2.png

该语句翻译成汉语大意如下:

假如条件为真
  那么

        执行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    结束判断

流程判断3.png

该语句翻译成汉语大意如下:

假如 条件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<= Alt10]dofor((B=1;B<=A;B++))
do
echo -n -e “ B ∗ B* BA=$((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]doechone"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


  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MagnumOvO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值