Shell编程之循环语句[for、while、until]、函数(递归函数)、数组
一:循环语句
1.1:for循环语句
1.1.1:for语句结构
- 读取不同的变量值,用来逐个执行同一组命令
语句结构
for 变量名 in 取值列表
do
命令序列
done
语句结构举例
for 收件人 in 邮件地址列表
do
发送邮件
done
1.2:for语句应用示例
1.2.1:批量添加/删除用户
添加需求描述:
- 用户名存放再users.txt文件中,每行一个
- 初始密码均设为123456
- 验证脚本
[root@localhost ~]# vim /opt/users.txt
tom
zhangsan
lisi
wangwu
[root@localhost ~]# vim users.sh
#!/bin/bash
#定义
list=`cat /opt/users.txt`
#遍历集合
for user in $list
do
#添加用户
useradd $user
#设置密码
echo "123456" |passwd --stdin $user
echo "设置${user}用户成功"
done
[root@localhost ~]# sh users.sh
更改用户 tom 的密码 。
passwd:所有的身份验证令牌已经成功更新。
设置tom用户成功
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新。
设置zhangsan用户成功
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
设置lisi用户成功
更改用户 wangwu 的密码 。
passwd:所有的身份验证令牌已经成功更新。
设置wangwu用户成功
删除需求描述:
- 删除上面添加的用户
[root@localhost ~]# vim users.sh
#!/bin/bash
#定义
list=`cat /opt/users.txt`
#遍历集合
for user in $list
do
#删除用户
userdel $user
#设置密码
#echo "123456" |passwd --stdin $user
echo "删除${user}用户成功"
done
[root@localhost ~]# sh users.sh
删除tom用户成功
删除zhangsan用户成功
删除lisi用户成功
删除wangwu用户成功
1.2.2:根据IP地址检查主机状态
需求描述:
- IP地址存放再hosts.txt文件中,每行一个
- 使用ping命令检测各主机的连通性
[root@localhost opt]# vim hosts.txt
20.0.0.1
192.168.100.100
20.0.0.2
[root@localhost opt]# vim pingip.sh
#!/bin/bash
#定义集合
list=`cat /opt/hosts.txt`
#遍历集合
for IP in $list
do
ping -c 3 -i 0.2 -W 3 $IP > /dev/null
#条件判断
if [ $? -eq 0 ];then
echo "$IP is on"
else
echo "$IP is down"
fi
done
[root@localhost opt]# sh pingip.sh
20.0.0.1 is down
192.168.100.100 is down
20.0.0.2 is on
1.2.3:用循环语句输出1-10的数字的方式
- 方式一:
#!/bin/bash
for ((i=1;i<=10;i++))
do
echo "$i"
done
- 方式二:
#!/bin/bash
i=1
for ((;i<=10;i++))
do
echo "$i"
done
- 方式三:
#!/bin/bash
i=1
for ((;i<=10;))
do
echo "$i"
let i++ done
- 方式四:
#!/bin/bash
i=1
for ((;;))
do
if [ $i -le 10 ];then
echo "$i"
let i++
else
exit 0
fi
done
- 四种方式输出结果都是一样的
[root@localhost opt]# ./number.sh
1
2
3
4
5
6
7
8
9
10
1.2.4:shell中let命令
-
let 对整数进行数学运算
-
let和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。
语法格式
let 表达式
或
let "表达式"
或
let '表达式'
以上方式都等价于 ((表达式))
- 当表达式中含有 Shell 特殊字符(例如 |)时,需要用双引号
" "
或者单引号' '
将表达式包围起来。 - 和 (( )) 类似,let 命令也支持一次性计算多个表达式,并且以最后一个表达式的值作为整个 let 命令的执行结果。
1.2.5:计算1-10偶数/奇数的和
方式一:计算偶数的和
#!/bin/bash
sum=0
#循环
for ((i=0;i<=10;i+=2))
do
let sum+=$i
done
echo "和为:${
sum}"
[root@localhost opt]# sh oushuhe.sh
和为:30
计算奇数的和
#!/bin/bash
sum=0
#循环
for ((i=1;i<=10;i+=2))
do
let sum+=$i
done
echo "和为: