读取不同的变量值,用来逐个执行同一组命令
语句结构
for 变量名 in 取值列表
do
命令序列
done
语句结构举例
for 收件人 in 邮件地址列表
do
发送邮件
done
用户名存放在users.txt文件中,每行一个
初始密码均设为123456
#!/bin/bash
List=$(cat /opt/user.txt)
for user in $List
do
useradd $user
echo "123456" | passwd --stdin $user
echo "创建$user结束"
done
[root@localhost opt]# bash users.sh
useradd:用户“laoguo”已存在
更改用户 laoguo 的密码 。
passwd:所有的身份验证令牌已经成功更新。
创建laoguo结束
useradd:用户“chengu”已存在
更改用户 chengu 的密码 。
passwd:所有的身份验证令牌已经成功更新。
创建chengu结束
useradd:用户“caicai”已存在
更改用户 caicai 的密码 。
passwd:所有的身份验证令牌已经成功更新。
创建caicai结束
在刚才的基础上,删除刚才新建的用户
#!/bin/bash
List=$(cat /opt/user.txt)
for user in $List
do
userdel -r $user
echo "删除$user成功"
done
[root@localhost opt]# bash users.sh
删除laoguo成功
删除chengu成功
删除caicai成功
[root@localhost opt]# cat /etc/passwd | grep "bash"
root:x:0:0:root:/root:/bin/bash
chenjian:x:1000:1000:chenjian:/home/chenjian:/bin/bash
检测IP地址192.168.100.1-192.168.10.段落
使用ping命令检测各主机的连通性
#!/bin/bash
for ((i=1;i<=10;i++))
do
ping -c 3 -i 0.1 -W 3 "192.168.100.$i"&> /dev/null
if [ $? -eq 0 ]
then
echo "主机 192.168.100.$i is up"
else
echo "主机 192.168.100.$i is down"
fi
done
[root@promote ~]# bash ping.sh
Host 192.168.100.1 is up
Host 192.168.100.2 is up
Host 192.168.100.3 is down
Host 192.168.100.4 is down
Host 192.168.100.5 is down
Host 192.168.100.6 is down
Host 192.168.100.7 is down
Host 192.168.100.8 is up
Host 192.168.100.9 is down
Host 192.168.100.10 is down
方式一:
#!/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
let 对整数进行数学运算
let和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算
语法格式
let 表达式
或
let "表达式"
或
let '表达式'
以上方式都等价于 ((表达式))
当表达式中含有 Shell 特殊字符(例如 |)时,需要用双引号" "或者单引号’ '将表达式包围起来。
和 (( )) 类似,let 命令也支持一次性计算多个表达式,并且以最后一个表达式的值作为整个 let 命令的执行结果。
方式一:计算偶数的和
#!/bin/bash
sum=0
for((i=0;i<=10;i+=2))
do
let sum+=$i
done
echo "总和为:$sum"
方式二:计算偶数的和
#!/bin/bash
sum=0
for((i=0;i<=10;i+=2))
do
if [ `expr $i % 2` -eq 0 ]
then
let sum+=$i
fi
done
echo "总和为:$sum"
方式一:计算奇数的和
#!/bin/bash
sum=0
for((i=1;i<=10;i+=2))
do
let sum+=$i
done
echo "总和为:$sum"
方式二:计算奇数的和
#!/bin/bash
sum=0
for((i=1;i<=10;i+=2))
do
if [ `expr $i % 2` -eq 1 ]
then
let sum+=$i
fi
done
echo "总和为:$sum"
重复测试某个条件,只要条件成立则反复执行
语句结构
while 条件测试操作
do
命令序列
done
语句结构示例
while 未猜中正确的价格
do
反复猜测商品价格
done
使用while循环语句输出1-10数字
#!/bin/bash
i=0
while [ $i -le 10 ]
do
echo "$i"
let i++
done
[root@localhost opt]# . cccc.sh
0
1
2
3
4
5
6
7
8
9
10
while true:死循环有时候也有奇效,可与用户交互
#!/bin/bash
while true
do
read -p "请输入yes退出:" KEY
if [ $KEY = yes ]
then
break
fi
done
echo "正常退出"
[root@localhost opt]# ./sixunhuan.sh
请输入yes退出:no
请输入yes退出:1
请输入yes退出:d
请输入yes退出:!
请输入yes退出:a
请输入yes退出:yes
正常退出
用户名称以stu开头,按数字顺序进行编号
一共添加20个用户,即stu1,stu2…stu20
初始密码设置为123456
#!/bin/bash
i=0
while [ $i -le 19 ]
do
let i++
useradd stu$i
echo "123456" | passwd --stdin stu$i &> /dev/null
echo "stu$i添加成功"
done
echo "添加完毕"
[root@localhost opt]# ./useradd.sh
stu1添加成功
stu2添加成功
stu3添加成功
stu4添加成功
stu5添加成功
stu6添加成功
stu7添加成功
stu8添加成功
stu9添加成功
stu10添加成功
stu11添加成功
stu12添加成功
stu13添加成功
stu14添加成功
stu15添加成功
stu16添加成功
stu17添加成功
stu18添加成功
stu19添加成功
stu20添加成功
添加完毕
通过变量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
命令格式
continue n
n 表示循环的层数:
如果省略 n,则表示 continue 只对当前层次的循环语句有效,遇到 continue 会跳过本次循环,忽略本次循环的剩余代码,直接进入下一次循环。
如果带上 n,比如 n 的值为 2,那么 continue 对内层和外层循环语句都有效,不但内层会跳过本次循环,外层也会跳过本次循环,其效果相当于内层循环和外层循环同时执行了不带 n 的 continue。这么说可能有点难以理解,稍后我们通过代码来演示。
continue 关键字也通常和 if 语句一起使用,即满足条件时便跳出循环。
命令格式
break n
n 表示跳出循环的层数,如果省略 n,则表示跳出当前的整个循环。
break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。
break 用来结束所有循环,循环语句不再有执行的机会;continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。