Shell编程之循环语句(until循环)与Shell函数、Shell数组

一、untli循环语句

1.1、until语句的结构

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

until 条件测试操作
do
 命令序列
done
while 未超过10
do
 数字依次增加
done

1.1.1、until语句应用1

计算1–50的和

通过循环累加的方式计算1–50的和

#!/bin/bash
i=1
S=0
until [ $i -eq 51 ]
do
 let S+=$i
 let i++

done
echo "$S"
[root@localhost opt]# ./jisuan.sh 
1275

1.1.2、until语句应用2

为指定用户发送在线消息

若指定用户不在线(未登陆系统),则每10分钟(实验中为了测试效果,可改为3s)试一次,直至用户登录系统后再发送信息
用户名与消息通过为止参数传递给脚本

#!/bin/bash
username=$1
#判断格式参数是否为空
if [ $# -lt 1 ]
 then
 echo "Usage:`basename $0` <username> [<message>]"
 exit 1
fi
#判断账号是否存在
if grep "^$username:" /etc/passwd &> /dev/nell;then :
  else
        echo "用户不存在"
        exit 2
fi
#判断用户是否在线
until who | grep "$username" &> /dev/null
do
        echo "用户不在线,正在尝试连接"
        sleep 3
done
mes=$*
echo "$mes" | write "$username"
[root@localhost opt]# ./mes.sh 
Usage:mes.sh <username> [<message>]
[root@localhost opt]# ./mes.sh wangwu
用户不存在
[root@localhost opt]# ./mes.sh stu1
用户不在线,正在尝试连接
用户不在线,正在尝试连接
^C

二、shell函数

2.1、shell函数概述

shell一个非常重要的特性是它可作为一种编程语言来使用。
因为shell是一个解释器,所以它不能对为它编写的程序进行编译,而是在每次从磁盘加载这些程序时对它们进行解释。而程序的加载和解释都是非常耗时的。
针对此问题,许多shell(如BourneAgainShell)都包含shell函数,shell把这些函数放在内存中,这样每次需要执行它们时就不必再从磁盘读入。
shell还以一种内部格式来存放这些函数,这样就不必耗费大量的时间来解释它们
shell函数将命令序列按格式写在一起
可以方便重复使用命令序列

2.2、Shell函数定义

[function]  函数名(){
命令序列
  [retunrn x]

}               使用return或exit可以显式地结束函数

其中,return返回的是状态码,需要使用$?调取

echo 返回的是值,使用变量调用

传参:指位置变量

可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。

参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255

2.3、调用函数的方法

函数名 [参数1($1)] [参数2($2)]
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数, 2 10 10 10 10 n > = 10 使 2表示第二个参数… 10不能获取第十个参数,获取第十个参数需要10 不能获取第十个参数,获取第十个参数需要10不能获取第十个参数,获取第十个参数需要{10}。当n>=10时,需要使用 {n}来获取参数。

2.4、shell函数应用1

两个数字求和

通过sum(){}定义函数
使用read命令交互输入两个数并求和

#!/bin/bash
#sum=0
 function  A (){
  read -p "请输入第一个数字:" B
  read -p "请输入第二个数字:" C
  sum=`expr $B + $C`
  echo "$B + $C = $sum"
  return 3
}
#echo $sum
A $B $C
[root@localhost opt]# ./han.sh 
请输入第一个数字:4
请输入第二个数字:2
4 + 2 = 6
[root@localhost opt]# echo $?
3
[root@localhost opt]# echo $?
0

2.5、shell函数应用2

编写登录系统后便可使用的自定义函数

编辑用户自定义函数文件/root/function

在当前shell中加载可执行的函数文件/root/function

在~/.bashrc文件中添加source /root/function命令

三、shell数组

3.1、数组应用场景

获取数组长度

使用for循环获取具体信息,使用下标或索引标记数组中数据的位置

可以存放多种数据,如:整型,长整形,浮点型(单精度,双精度),字符串等

获取元素长度

遍历元素

元素切片

元素替换

元素删除

注意,忌讳数组越界,

数组下标从0开始算

数组长度从1开始算

长度为4,数组长度表示为1,2,3,4;数组下标表示为0,1,2,3

shell中数组是可变长的

3.2、数组定义方法(推荐方法一)

方法一:

基本格式
数组名=(value0 value1 value2...

例如:

例如
ABC=11 22 33...

方法二:

基本格式
数组名=[0]=value [1]=value [2]=value...

例如:

例如
ABC=[0]=11 [1]=22 [2]=33...)

方法三:数组元素之间使用空格隔开

基本格式
列表名=“value0 value1 value2”
数组名=($列表名)

例如:

例如
AAA=11 22 33...”
ABC=($列表名)

方法四:

基本格式
数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”
...

例如:

例如
AAA[0]=11”
AAA[1]=22”
AAA[2]=33...

3.3、数组包括的数据类型与数组操作

3.3.1、数组包括的数据类型

数值类型

字符类型

使用“”或‘’定义
数组只可存放数值或字符

3.3.2、数组操作

获取数组长度

[root@localhost ~]# abc=(10 20 30)
[root@localhost ~]# echo ${abc[*]}
10 20 30
[root@localhost ~]# echo ${#abc[*]}
3

读取某下标赋值

基本格式
${数组名[下标]}
例如
[root@localhost opt]# echo ${abc[1]}
20
[root@localhost opt]# echo ${abc[0]}
10
[root@localhost opt]# echo ${abc[1]}
20
[root@localhost opt]# echo ${abc[2]}
30

3.4、求数组最大值

#!/bin/bash
for ((i=1;i<=5;i++));do
  read -p "请输入第$i个数字:" num
  abc[$i-1]=$num
done

max=${abc[0]}
for ((k=1;k<=${#abc[*]}-1;k++));do
  if [ $max -lt ${abc[$k]} ];then
   max=${abc[$k]}
  fi
done
echo "最大值是:$max"   
[root@localhost opt]# chmod +x max.sh 
[root@localhost opt]# ./max.sh 
请输入第1个数字:2
请输入第2个数字:3
请输入第3个数字:66
请输入第4个数字:33
请输入第5个数字:111
最大值是:111

猜你喜欢

转载自blog.csdn.net/weixin_47151650/article/details/107584990