循环+函数
循环+函数
一、循环语句
1、for循环详解
for循环语句允许脚本一次性读取多个信息,然后逐一对信息进行操作处理。当要处理的数据有范围时,
使用for循环语句就再适合不过了。
读取不同的变量值,用来逐个执行同一组命令
语法:
for 变量名 in 取值列表
do
命令序列(命令行)
done
示例1:
下面使用for循环语句从列表文件中读取多个用户,然后为其逐一创建用户账户并设置密码。
首先创建用户名称的列表文件users.txt,每个用户名称单独一行。
#!/bin/bash
for i in ` cat /root/users.txt `
do useradd $i; echo 123456 | passwd --stdin $i
done
[root@ws ~]# ./a.sh
更改用户 m 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 bob 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 marry 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 rose 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 mike 的密码 。
passwd:所有的身份验证令牌已经成功更新。
接下来编写shell标本addusers.sh。在脚本中使用read命令读取用户输入的密码值,然后赋值给PASSWD
变量,并通过-p参数向用户显示一段提示信息,告诉用户正在输入的内容即将作为账户密码
#!/bin/bash
for i in ` cat /root/users.txt `
do useradd $i
read -p "请输入$i用户的密码:" PASSWD
echo $PASSWD | passwd --stdin $i
done
[root@ws ~]# ./a.sh
请输入jim用户的密码:111
更改用户 jim 的密码 。
passwd:所有的身份验证令牌已经成功更新。
请输入bob用户的密码:222
更改用户 bob 的密码 。
passwd:所有的身份验证令牌已经成功更新。
请输入marry用户的密码:333
更改用户 marry 的密码 。
passwd:所有的身份验证令牌已经成功更新。
请输入rose用户的密码:444
更改用户 rose 的密码 。
passwd:所有的身份验证令牌已经成功更新。
请输入mike用户的密码:555
更改用户 mike 的密码 。
passwd:所有的身份验证令牌已经成功更新。
示例2:
循环输出1-10
#!/bin/bash
for ((i=1;i<=10;i++))
doecho $i
done
[root@ws ~]# ./b.sh
1
2
3
4
5
6
7
8
9
10
示例3:
用for语句,输出1-100的所有整数和
#!/bin/bash
a=0
for ((i=1;i<=100;i++))
doa=$[ $a+$i ]
done
echo $a
[root@ws ~]# ./b.sh
5050
示例4:
根据IP地址检测主机状态
主机列表
[root@ws ~]# vim iplist
192.168.110.10
192.168.110.20
192.168.110.30
#!/bin/bash
for i in ` cat /root/iplist `
do
ping -c 4 $i &>/dev/null
if [ $? -eq 0 ];thenecho "$i能通"
elseecho "$i不能通"
fi
done
[root@ws ~]# ./a.sh
192.168.110.10能通
192.168.110.20不能通
192.168.110.30不能通
2、while语句
重复测试某个条件,只要条件成立,则反复执行
示例1:
显示0-10的所有整数
#!/bin/bash
a=0
while [ $a -le 10 ]
doecho $alet a++
done
[root@ws ~]# ./c.sh
0
1
2
3
4
5
6
7
8
9
10
示例2:
求1-100的整数和
#!/bin/bash
a=0
b=0
while [ $a -le 100 ]
dob=$(($a+$b))((a++))
done
echo $b
[root@ws ~]# ./c.sh
5050
随机数
[root@ws ~]# expr 555 % 1000
555
[root@ws ~]# expr $RANDOM % 1000
733
[root@ws ~]# expr $RANDOM % 1000
472
示例3:
随机猜数字游戏,100以内的猜数字游戏
#!/bin/bash
num=$(expr $RANDOM % 100)
a=0
echo "数字范围为0-100的整数,猜猜看"
while true
do
read -p "请输入值:" n
((a++))
if [ $n -lt $num ];thenecho "你输入的值小了"
elif [ $n -gt $num ];thenecho "你输入的值大了"
elseecho "恭喜你 猜对了"echo "你猜的次数为$a"exit
fi
done
[root@ws ~]# ./e.sh
数字范围为0-100的整数,猜猜看
请输入值:50
你输入的值大了
请输入值:40
你输入的值小了
请输入值:45
你输入的值大了
请输入值:43
恭喜你 猜对了
你猜的次数为4
3、until语句
重复测试某个条件,只要条件不成立,则反复执行
示例1:
练习
求1-100的整数和
#!/bin/bash
a=0
b=0
until [ $a -ge 100 ]
dob=$(($a+$b))((a++))
done
echo $b
[root@ws ~]# ./b.sh
5050
4、双for循环
即在一个for循环内部再加一个for循环
#!/bin/bash
for (( i=1;i<=3;i++))
doecho "i=$i"for (( e=1;e<=4;e++))doecho "e=$e"done
done
[root@ws ~]# bash f.sh
i=1
e=1
e=2
e=3
e=4
i=2
e=1
e=2
e=3
e=4
i=3
e=1
e=2
e=3
e=4
5、break和continue
在内循环执行break 就跳出当前的内循环了,去执行外循环了
作用:
1跳出当前循环
2并且break下面的语句不去执行
(1)break,我们可以通过内外循环的输出来看break的特性。
#!/bin/bash
for (( i=1;i<=3;i++))
doecho "i=$i"for (( e=1;e<=4;e++))doif [ $e -eq 2 ];thenbreakfiecho "e=$e"donedone
[root@ws ~]# bash f.sh
i=1
e=1
i=2
e=1
i=3
e=1
内循环到2就停止了,3就不去判断了
(2)continue
中止某次循环,不会完全终止整个命令
for((a=1;a<=15;a++))
doif [ $a -gt 5 ] && [ $a -lt 10 ]thencontinuefiecho " $a "
done
[root@ws ~]# ./ff.sh 1 2 3 4 5 10 11 12 13 14 15
二、函数
将命令序列按格式写在一起
可重复使用命令序列
1、shell函数定义格式
function 函数名{
命令序列
}
函数名(){
命令序列
}
2、函数返回值
return
return 表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值(0-255)
原则:
1.函数已结束就取返回值,因为 $? 只是对最后一条命令进行判断
2.0-255,超出时 除以256取余
echo也能直接返回
测试案例
#!/bin/bash
function ws {read -p "请输入任意一个整数:" nreturn $[$n*2]
}
ws
echo "$?"
请输入任意一个整数:3
6
[root@ws ~]# ./a.sh
请输入任意一个整数:200
144
3、函数传参
函数变量的作用范围(局部变量以及全局变量)
函数在shell脚本中仅在当前shell环境中有效
shell脚本中变量默认全局有效
将变量限定一个函数的内部local,即局部变量
(1)传参
#!/bin/bash
sum1 () {sum=$[ $1 + $2 ]echo $sum
}
sum1 $1 $2
[root@ws ~]# ./b.sh 12 13
25
(2)变量的局部与全局
将变量限定在函数内部使用local命令
即这个local的变量仅仅在当前的函数内有效,在别的函数中无效。
#!/bin/bash
a () {echo "函数内的未经过local的变量i值$i"local ii=7echo "函数内的变量i值是$i"
}
i=8
a
echo "函数外面的变量i值是$i"
[root@ws ~]# ./b.sh
函数内的未经过local的变量i值8
函数内的变量i值是7
函数外面的变量i值是8
(3)local的进击
#!/bin/bash
a () {echo "inside1 $i"let i++local ii=8[root@ws ~]# ./c.sh
inside1 9
inside2 8
outside 10echo "inside2 $i"}
i=9
a
echo "outside $i"
[root@ws ~]# ./c.sh
inside1 9
inside2 8
outside 10
4、递归(调用自己)
#!/bin/bash
function ws() {if [ $1 -eq 1 ];thenecho 1elselocal temp=$[ $1-1 ]local result=`ws $temp`echo $[ result*$1 ]fi}
read -p "输入一个值:" vaule
result=`ws $vaule`
echo "阶乘的值为: $result"
[root@ws ~]# bash d.sh
输入一个值:2
阶乘的值为: 2
[root@ws ~]# bash d.sh
输入一个值:3
阶乘的值为: 6
[root@ws ~]# bash d.sh
输入一个值:4
阶乘的值为: 24
5、函数库
就是把一般脚本的主体执行代码和定义函数部分相互分离,把定义的函数部分集中放在同一个脚本中。
具体执行的时候,只需要直接进行调用函数集合的脚本文件即可。
这里我把加减乘除共4个函数,做了一个函数库。
vim ee.sh
#!/bin/bash
jia() {result=$[ $1 + $2 ]echo "$result"
}jian() {result=$[ $1 - $2 ]echo "$result"
}cheng() {result=$[ $1 * $2 ]echo "$result"
}chu() {if [ $2 -ne 0 ];thenresult=$[ $1 / $2 ]echo "$result"elseecho "除法中分母不能为0"fi
}
vim ff.sh
#!/bin/bash
. /root/ee.sh
read -p "请输入第一个数字:" n
read -p "请输入第二个数字:" mresult1=`jia $n $m`
result2=`jian $n $m`
result3=`cheng $n $m`
result4=`chu $n $m`echo "两数之和为: $result1"
echo "两数之差为: $result2"
echo "两数之积为: $result3"
echo "两数之商为: $result4"
[root@ws ~]# ./ff.sh
请输入第一个数字:8
请输入第二个数字:4
两数之和为: 12
两数之差为: 4
两数之积为: 32
两数之商为: 2