shell循环语句-for、while、until、函数以及数组的使用

目录

一、for循环

1、语法结构

2、概念

3、实例

二、while循环

1、语法结构

2、概念

3、实例

三、until 语句

1、语句结构

2、概念

3、实例

四、函数

 1、语法结构

2、概念

3、sh和set使用

4、实例

五、数组应用

1、应用场景

2、定义

数组的分类

定义方式

3、参数功能

4、冒泡升降排序


一、for循环

1、语法结构

for 变量名 in 取值列表

do
    命令序列
done



for 变量名 in 取值列表

do
    for 变量名 in 取值列表

    do
         命令序列
    done
done

2、概念

单循环——for循环就是把一个步骤一直重复执行的操作。如果没有终止条件,那么这一步骤就会一直执行下去,直到为止。书本上对循环的定义是:用来控制语句块重复执行的一种结构

双循环——也可以理解为内外循环,就是取第一个外循环参数执行后,进入内循环,一直把内循环一直操作,直到为止,在跳出内循环,执行外循环的第二个参数,再次进入内循环,进行操作,直到为止,以此方式一直执行下去,直到外循和内循环结束,执行的次数可以简单理解为n*n次。

3、实例

 

二、while循环

1、语法结构

while 条件测试操作
do
    命令序列
done

2、概念

重复测试某个条件,只要条件成立则反复执行

首先判断while后的条件测试操作结果,如果条件成立,则再次测试,直到结果不成立为止

3、实例

 

三、until 语句

1、语句结构

until 条件测试操作
do
    命令序列
done

2、概念

重复测试某个条件,只要条件不成立则反复执行

首先判断until后的条件测试操作结果,如果不条件成立,则再次测试,直到结果成立为止

3、实例

四、函数

 1、语法结构

function 函数名 {
命令序列
}

或者

函数名 () {

命令序列

}

2、概念

函数定义完之后并不会自动执行,需要调用才行,好处在于可以写一段功能代码作为函数,有需要就直接调用定义的时候哪怕出现语法错误也没关系,不调用就不会报错
当然我们写函数最终目的还是为了调用,为了实现某个功能块
 

3、sh和set使用

set -x:显示运行过程

set +x:不显示运行过程

sh 参数 脚本名字

 -n:不会执行该脚本,仅查询脚本语法是否有问题,如果没有语法问题就不显示任何内容,如果有问题会提示报错。
 
-v:在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也会给出错误提示。

-x:将执行的脚本内容输出到屏幕上,这个是对调试很有用的参数。  当脚本文件较长时,可以使用 set 命令指定调试一段脚本

4、实例

其实我们只是想echo出fa5
fa5=5*fa4
fa4=4*fa3
fa3=3*fa2
fa2=2*fa1
fa1=1

五、数组应用

1、应用场景

获取数组长度、获取元素长度、遍历元素、元素切片、元素替换、元素删除

2、定义

数组是存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用

数组的分类

普通数组:不需要声明直接定义,下标索引只能是整数
关联数组:需要用declare -A声明否则系统不识别,索引可以是字符串

定义方式

数组  ( 10 5 8 3 )
位置     0 1 2 3

第一种:直接把要加入数组的元素用小括号括起来,中间用空格分开

num=(11 22 33 44)
${ #num}显示宁符串长度
数组名=(valueo value1 value2)

第二种:精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续

num=([0]=55   [1]=66   [2]=77    [4]=88)
数组名=( [0]=value   [1]=value    [2]=value. . .)

第三种:先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组

list=“11 12 13 14”
num=($list)
\列表名=valueo valuel value2. ..."

数组名=($列表名)

第四种根据下标定义

数组名[0]=”11"
数组名[0]="22"

数组名[0]="33"
数组名[0]="value"

数组名[1]="value"

数组名[2]="value""
 

3、参数功能

[root@localhost ~]# an=(10 20 15)   #定义数组
[root@localhost ~]# an_lg=${an[*]}
[root@localhost ~]# echo $an_lg     #输出数的整体
10 20 15
[root@localhost ~]# an_lg=${an[@]}
[root@localhost ~]# echo $an_lg     #输出每个位置对应的数
10 20 15
[root@localhost ~]# an_lg=${#an[@]}
[root@localhost ~]# echo $an_lg     #输出一共多少个数
3
[root@localhost ~]# an_lg=${an[2]}
[root@localhost ~]# echo $an_lg     #输出对应2位置上的数
15
[root@localhost ~]# echo ${an[*]:2:1}  #从第二个位置开始切,一个字符
15
[root@localhost ~]# arr=(1 2 3 4 5 6 7)
[root@localhost ~]# echo ${arr[*]/4/70}    #把4替换成70
1 2 3 70 5 6 7
[root@localhost ~]# echo ${arr[*]/6/70}
1 2 3 4 5 70 7
[root@localhost ~]# unset arr[5]        
[root@localhost ~]# echo ${arr[*]}      #输出对应5上面的字符
1 2 3 4 5 7

4、冒泡升降排序

#!/bin/bash

arr=(30 10 50 60 40 20)
echo "原数组的顺序为:${arr[*]} "

#获取数组的长度
length=${#arr[*]}

#冒泡排序:

#定义比较轮数,为数组长度减一,并且要从1开始
for ((i=1; i<$length; i++))
do

#确定每次比较的元素下标,比较相邻2个元素,大的往后放,小的往前放,并且每轮比较的次数要随着轮>
数递减for ((j=0;j<$length-$i; j++))
do

#获取第一个元素的值
first=${arr[$j]}

#获取第二个元素的值
k=$[$j+1]
second=${arr[$k]}

#比较第一个元素和第二个元素的值,如果第一个元素值大于第二个元素值则两个元素位置交换
if [ $first -gt $second ];then

#先把第一个元素的值保存在临时变量temp中
temp=${arr[$j]}

#把第二个元素的值赋给第一个元素
arr[$j]=$second

#把原来第一个元素的值赋给第二个元素
arr[$k]=$temp
fi
done
done
echo "排序后新的数组的顺序为:${arr[*]}"


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值