文章目录
一、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表示第一个参数,
{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