Shell编程之循环语句与函数,数组(for循环、while循环、untli循环)

循环语句

for循环语句

读取不同的变量值,用来逐个执行同一组命令

语句结构
for 变量名 in 取值列表
do
	命令序列
done

语句结构举例
for 收件人 in 邮件地址列表
do
	发送邮件
done

在这里插入图片描述

使用for批量添加用户

用户名存放在111.txt文件中,每行一个
初始密码均设为123456

[root@localhost opt]# vim 111.txt
stu1
stu2
stu3
stu4
[root@localhost opt]# vim useradd.sh
#!/bin/bash
name=$(cat /root/111.txt)
for a in $name
do
        useradd $a
        echo "123456" | passwd --stdin $a
        echo "$a添加成功"
done
[root@promote ~]# . 333.sh 
更改用户 stu1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
stu1添加成功
更改用户 stu2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
stu2添加成功
更改用户 stu3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
stu3添加成功
更改用户 stu4 的密码 。
passwd:所有的身份验证令牌已经成功更新。
stu4添加成功

根据IP地址检查主机状态

检测IP地址192.168.110.0-192.168.110.10段落
使用ping命令检测各主机的连通性

#!/bin/bash
for ((a=1;a<=10;a++))
do
  ping -c 3 -i 0.2 -W 3 "192.168.110.$a" &> /dev/null
  if [ $? -eq 0 ]
        then
        echo "Host 192.168.110.$a is up"
  else
        echo "Host 192.168.110.$a is down"
  fi
done
[root@promote ~]# . 222.sh 
Host 192.168.110.1 is up
Host 192.168.110.2 is up
Host 192.168.110.3 is down
Host 192.168.110.4 is down
Host 192.168.110.5 is down
Host 192.168.110.6 is down
Host 192.168.110.7 is down
Host 192.168.110.8 is down
Host 192.168.110.9 is down
Host 192.168.110.10 is up

用循环语句输出1-10的数字的四种办法

#!bin/bash
for ((a=1;a<=10;a++))
do
  echo $a
done       
[root@promote ~]# . 222.sh 
1
2
3
4
5
6
7
8
9
10

shell中let命令

let 对整数进行数学运算

let和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。

语法格式
let 表达式
或
let "表达式"
或
let '表达式'
以上方式都等价于 ((表达式))

当表达式中含有 Shell 特殊字符(例如 |)时,需要用双引号" "或者单引号’ '将表达式包围起来。

和 (( )) 类似,let 命令也支持一次性计算多个表达式,并且以最后一个表达式的值作为整个 let 命令的执行结果。

计算1-10偶数/奇数的和

#!bin/bash
he=0
for((a=0;a<=10;a+=2))
  do
        if [ `expr $a % 2` -eq 0 ]
         then
           let he+=$a
        fi
  done
        echo "总和为:$he"          
[root@promote ~]# . abc.sh 
总和为:30

加法运算:+
减法运算:-
乘法运算:\*
除法运算:/
求模(取余)运算:%

++   自身变量+1
+=5  自身变量+5
-=5  自身变量-5
\*=5 自身变量*5
....

while循环语句

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

语句结构
while 条件测试操作
do
	命令序列
done

语句结构示例
while 未猜中正确的价格
do
	反复猜测商品价格
done

在这里插入图片描述

使用while循环语句输出1-10数字

#!/bin/bash
a=1
while [ $a -le 10 ]
do
  echo "$a"
 let a++
done
[root@promote ~]# . 111.sh 
1
2
3
4
5
6
7
8
9
10

猜商品价格游戏

通过变量RANDOM获得随机数

提示用户猜测并记录次数,猜中后退出循环

#!/bin/bash
A=`expr $RANDOM % 1000`
i=0
echo "商品的实际价格为0-999之间,猜猜看是多少?"
read -p "请输入你猜测的价格数目:" num
while [ $num -le 999 ] && [ $num -ge 1 ] 
do
        let i++
     if [ $num -eq $A ]
        then
        echo "恭喜你答对了,实际价格是$A"
        echo "你一共猜测了$i 次"
        exit 0
     elif [ $num -lt $A ]
        then
        echo "太低了"
        read -p "请输入你猜测的价格数目:" num
     else
        echo "太高了"
        read -p "请输入你猜测的价格数目:" num
     fi
  done

untli循环语句

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

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

until 未超过10
do
 数字依次增加
done

在这里插入图片描述

计算1–50的和

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

done
echo "$S"
[root@promote ~]# . 111.sh 
1275

Shell函数

shell函数概述

shell一个非常重要的特性是它可作为一种编程语言来使用。

因为shell是一个解释器,所以它不能对为它编写的程序进行编译,而是在每次从磁盘加载这些程序时对它们进行解释。而程序的加载和解释都是非常耗时的。

针对此问题,许多shell(如BourneAgainShell)都包含shell函数,shell把这些函数放在内存中,这样每次需要执行它们时就不必再从磁盘读入。

shell还以一种内部格式来存放这些函数,这样就不必耗费大量的时间来解释它们

shell函数将命令序列按格式写在一起

可以方便重复使用命令序列

调用函数的方法

函数名 [参数1($1)] [参数2($2)]

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…

10不能获取第十个参数,获取第十个参数需要{10}。当n>=10时,需要使用${n}来获取参数。

shell函数应用——两个数字求和

通过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

Shell数组

数组应用场景

  • 获取数组长度

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

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

  • 获取元素长度

  • 遍历元素

  • 元素切片

  • 元素替换

  • 元素删除

  • ……


数组名称 arr=(11,22,33,44) arr就是数组名称(名字自己定义)
数组元素 (11,22,33,44)
数组长度 数组中元素的个数(4)
数组下标 第一个元素下标是0,第二个是1以此往后(33的下标值是2)
切片:只拿中间的某个子部分

数组定义方法

第一种
[root@promote ~]# abc=(1 2 3 4 5)
[root@promote ~]# echo ${abc[*]}  #*所有下标
1 2 3 4 5
[root@promote ~]# echo $abc
1
根据下标调用元素
[root@promote ~]# echo ${abc[4]}
5

第二种
[root@promote ~]# abc=([0]=22 [1]=33 [2]=44 [3]=55)
[root@promote ~]# echo ${abc[@]}    #@和*都表示所有
22 33 44 55

第三种
[root@promote ~]# abc="12 34 56 78"
[root@promote ~]# cba=($abc)
[root@promote ~]# echo ${cba[*]}
12 34 56 78

第四种
[root@promote ~]# a[0]="1"
[root@promote ~]# a[1]="2"
[root@promote ~]# a[3]="3"
[root@promote ~]# echo ${a[*]}
1 2 3

创建任意数字及长度的数组,根据客户需求加入元素

#!bin/bash
i=0			#数组下标
while true
do
  read -p "是否存入元素(yes/no):" a
  if [ $a == no ];then
    break
  fi
  read -p "请存入第$[$i+1]个元素:" b
  aaa[$i]=$b
  let i++
done
echo ${aaa[*]}

猜你喜欢

转载自blog.csdn.net/CN_PanHao/article/details/107480451