一.循环语句
1.for 语句的结构
(1)for in 循环
读取不同的变量值,用来逐个执行同一组命令
for 变量名 in 取值列表 for 收件人 in 邮件地址列表
do do
命令序列 发送邮件
done done
[root@localhost opt]# for i in 1 2 3 4 5
> do
> echo "进行了 $i 次跳舞 "
> done
进行了 1 次跳舞
进行了 2 次跳舞
进行了 3 次跳舞
进行了 4 次跳舞
进行了 5 次跳舞
[root@localhost opt]# vim name.txt
A
.....
L
[root@localhost opt]# for name in `cat name.txt`
>do
> echo $name
> done
A
.....
L
[root@localhost opt]# for name in `cat name.txt`
> do
> useradd $name
> done
#进入/etc/passwd 文件中可以查看到创建的用户
[root@localhost opt]# vim /etc/passwd
A:x:1001:1001::/home/A:/bin/bash
B:x:1002:1002::/home/B:/bin/bash
C:x:1003:1003::/home/C:/bin/bash
D:x:1004:1004::/home/D:/bin/bash
E:x:1005:1005::/home/E:/bin/bash
F:x:1006:1006::/home/F:/bin/bash
G:x:1007:1007::/home/G:/bin/bash
H:x:1008:1008::/home/H:/bin/bash
I:x:1009:1009::/home/I:/bin/bash
J:x:1010:1010::/home/J:/bin/bash
K:x:1011:1011::/home/K:/bin/bash
L:x:1012:1012::/home/L:/bin/bash
[root@localhost opt]# for name in `cat name.txt`
> do
> echo 123456 | passwd --stdin $name
> done
更改用户 A 的密码 。
passwd:所有的身份验证令牌已经成功更新。
.......
更改用户 L 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost opt]# for name in `cat name.txt`
> do
> echo 123456 | passwd --stdin $name &> /dev/null #加上混合输出可以省略提示
> done
[root@localhost opt]# for i in {1..10}
> do
> echo "进行 $i 次跳舞"
> done
进行 1 次跳舞
进行 2 次跳舞
进行 3 次跳舞
进行 4 次跳舞
进行 5 次跳舞
进行 6 次跳舞
进行 7 次跳舞
进行 8 次跳舞
进行 9 次跳舞
进行 10 次跳舞
(2)for ((变量=初始值;变量范围;变量的迭代方式)) 循环
格式:for ((i=1;i<10;i++))
[root@localhost opt]# for ((i=1; i<10; i++)); do echo $i; done
1
2
3
4
5
6
7
8
9
[root@localhost opt]# echo $i
10
[root@localhost opt]# echo $i
10
for循环实现多线程
for ((i=1; i<=10; i++))
do
{
命令序列
....
}& #将每次循环的进程都放入后台自行运行
done
wait #等待上面所有循环的进程都执行完毕后再执行后面的命令
命令序列
IFS for循环取值列表分隔符
set | grep IFS --> IFS=$' \t\n' 默认包含 空格、制表符、换行符求字符串分片 ${变量:下标:长度} #下标从0开始
求字符串长度 ${#变量}
求随机数 $RANDOM #0~32767
求0到N-1之间的随机数 $[RANDOM % N]
2.for 循环的实践
要创建 .sh 结尾的脚本;且完成循环的配置后要给脚本文件加上 x 执行权限(使用chmod +x)
(1)计算从1到100所有整数的和
#!/bin/bash
#计算从1到100所有整数的和
sum=0
for i in {1..100};
do
sum=$(($i+$sum))
done
echo "$sum"
(2)求提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和
#!/bin/bash
#提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和
# 提示用户输入一个小于100的整数
read -p "请输入一个小于100的整数:" number
# 初始化求和变量为0
sum=0
# 使用for循环计算从1到用户输入数字的整数和
for (( i=1; i<=$number; i++ )); do
sum=$((sum + i))
done
# 输出结果
echo "从1到 $number 的所有整数的和为:$sum"
(3)求从1到100所有整数的偶数和、奇数和
#!/bin/bash
#求从1到100所有整数的偶数和、奇数和
# 初始化偶数和奇数的和为0
JSsum=0
OSsum=0
# 使用for循环遍历从1到100的所有整数
for i in {1..100}
do
# 检查当前数字是偶数还是奇数
if (( $i % 2 == 0 )); then
# 如果是偶数,则加到偶数和上
OSsum=$((OSsum + i))
else
# 如果是奇数,则加到奇数和上
JSsum=$((JSsum + i))
fi
done
# 输出结果
echo "从1到100的所有整数的偶数和为:$OSsum"
echo "从1到100的所有整数的奇数和为:$JSsum"
(4)编写能够自动生成一个6位随机密码的脚本
#!/bin/bash
#编写能够自动生成一个6位随机密码的脚本
STR="0123456789qwertyuiopasdfghjklzxcvbnm"
for ((i=1;i<=6;i++))
do
num=$[RANDOM % ${#STR}]
passwd=${STR:num:1}
password+=$passwd
done
echo "6位随机密码为 $password"
3.while 语句的结构
while 条件测试操作 while 未猜中正确价值
do do
命令序列 反复猜测商品价格
done done
while 循环
while [ 条件表达式 ] #条件成立时才会循环执行do里面的命令序列
do
命令序列
....
变量的迭代方式
done
从文件读取行内容循环
cat 文件 | while read 变量
do
命令序列
....
done
while read 变量
do
命令序列
....
done < 文件
[root@localhost for]# a=1
[root@localhost for]# while [ $a -le 10 ]
> do
> echo $a
> let a++
> done
1
2
3
4
5
6
7
8
9
10
[root@localhost for]# echo $a
11
4.while 循环的实践
(1)计算从1到100所有整数的和
#!/bin/bash
#计算从1到100所有整数的和
a=1
sum=0
while [ $a -le 100 ]
do
sum=$[ sum + $a ]
let a++
done
echo "1到100的和为 $sum"
(2)提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和
#!/bin/bash
#提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和
a=1
sum=0
read -p "请输入一个小于100的整数:" num
if [ $num -ge 1 ] && [ $num -le 100 ];then
while [ $a -le $num ]
do
let sum+=a
let a++
done
echo "从1到该数之间所有整数的和为:$sum "
else
echo "输入有误!"
fi
(3)求从1到100所有整数的偶数和、奇数和
#!/bin/bash
#求从1到100所有整数的偶数和、奇数和
a=1
jisum=0
ousum=0
while [ $a -le 100 ]
do
b=$[ a % 2 ]
if [ $b -eq 0 ];then
let ousum+=$a
else
let jisum+=$a
fi
let a++
done
echo -e "从1到100的所有整数的偶数和为:$ousum\n 奇数和为:$jisum"
(4)用户输入密码,脚本判断密码是否正确,正确密码为123456,输入正确提示正确信息,连>续输错3次则报警
#!/bin/bash
#用户输入密码,脚本判断密码是否正确,正确密码为123456,输入正确提示正确信息,连续输错3次则报警
i=1
while [ $i -le 3 ]
do
read -p "请输入密码:" passwd
if [ "$passwd" == "123456" ];then
echo "密码正确"
exit 0
else
echo "密码错误"
fi
let i++
done
echo "警告,密码已输错三次"
(5)编写能够自动生成一个6位随机密码的脚本
#!/bin/bash
#编写能够自动生成一个6位随机密码的脚本
i=0
STR="0123456789qwertyuiopasdfghjklzxcvbnm"
while [ $i -lt 6 ]
do
num=$[RANDOM % ${#STR}]
passwd=${STR:num:1}
password+=$passwd
let i++
done
echo "6位随机密码为 $password"
5.until 语句的结构
重复测试某个条件,只要条件不成立就反复执行(和while相反)
until 条件测试操作 while 未超过10
do do
命令序列 数字依次递增
done done
拓展:常用转义符
echo -n 表示不换行输出
echo -e 输出转义字符,将转义后的内容输出到屏幕上
\b 转义后相当于按退格键(backspacp),但前提是 "\b" 后面存在字符: "\b" 表示删除前一个字符,”
\b\b“ 表示删除前两个字符
\c 不换行输出,在 ”\c“ 之后面不存在字符的情况下,作用相当于 echo -n ;但是当 ”\c“ 后面任然
存在字符时,"\c" 后面的字符将不会输出。
\n 换行,被输出的字符从 ”\n“ 处开始另起一行
\f 换行,但是换行后的新行的开头位置连接着上一行的行尾
\v 与\f 相同
\t 转以后表示插入tab,即横向制表符
\r 光标移至行首,但是不会换行,相当于使用”\r“ 以后的字符覆盖”\r“之前同等长度的字符;但是当"\r" 后面不存在的任何字符,”\r“前面的字符不会被覆盖
\\ 表示插入” \ “ 本身
6.多重循环
(1)将一个点分十进制格式的IP地址转换成点分二进制格式
#!/bin/bash
#将一个点分十进制格式的IP地址转换成点分二进制格式
IP="192.168.80.30"
n=0
#外循环分割出IP的每段数值
for ((i=1; i<=4; i++))
do
num=${IP%%.*}
IP=${IP#*.}
#echo $num
#每次开始内循环前将result变量值清空
result=''
#内循环使用余数倒排法进行数值转换
for j in {1..8}
do
yushu=$[num % 2]
num=$[num / 2]
result=$yushu$result
done
let n++
#使用n变量作为计数器,当n=4即转换IP的第4段数值后不再使用echo -n
if [ $n -lt 4 ];then
echo -n ${result}.
else
echo $result
fi
done
(2)输出PATH环境变量的目录里所有以se开头的不可执行文件
#!/bin/bash
#输出PATH环境变量的目录里所有以se开头的不可执行文件
IFS_OLD=$IFS
IFS=$IFS':'
for folder in $PATH
do
file=$(find $folder -name "se*" 2> /dev/null)
for i in $file
do
if [ ! -x $i ];then
echo $i
fi
done
done
IFS=$IFS_OLD
(3)输出一个99乘法表
(4)输出一个正直角三角形
#!/bin/bash
#正直角三角形
#外循环控制三角的行数
for ((a=9; a>=1; a--))
do
#内循环控制每行输出的 * 的数量,第一行输出一个*,每行递增
for ((b=9; b>=a; b--))
do
echo -n "*"
done
echo ""
done
(5)输出一个倒直角三角形
#!/bin/bash
#倒直角三角形
#外循环控制行数
for ((a=1; a<=9; a++))
do
#内循环控制每行输出的*数量,第一行输出最多,每行做递减
for ((b=9; b>=a; b--))
do
echo -n "*"
done
echo ""
done
(6)输出一个等腰三角形
#!/bin/bash
#等腰三角形
read -p "请输入三角形的大小数值:" num
#控制三角形的行数
for ((a=1; a<=num; a++))
do
#输出倒三角每行的空格数,第一行4个,第二行3个,每行做递减
for ((i=num; i>a; i--))
do
echo -n " "
done
#输出等腰三角每行的*数,第一行输出1个,第二行3个,第三行5个,以此类推
c=$[(a*2)-1]
for ((b=1; b<=c; b++))
do
echo -n "*"
done
echo ""
done
(7)输出一个菱形
#!/bin/bash
#菱形
read -p "请输入大小数值:" num
for ((a=1; a<=num; a++))
do
for ((i=num; i>a; i--))
do
echo -n " "
done
c=$[(a*2)-1]
for ((b=1; b<=c; b++))
do
echo -n "*"
done
echo ""
done
for ((a=num-1; a>=1; a--))
do
#输出空格正三角
for ((b=num; b>a; b--))
do
echo -n " "
done
#输出倒等腰三角
c=$[(a*2)-1]
for ((i=1; i<=c; i++))
do
echo -n "*"
done
echo ""
done