linux——shell编程:循环
目录
一、语法
1、for:
- 写法1:
for 变量名 in 列表;do
循环体
done
- 写法2:
for((i=1;判断条件;i++));do
循环体
done
2、while:
while 条件判断;do
循环体
done
二、循环中断:
- continue :跳过本次循环,不继续往下执行,直接进入下次循环,continue+数字,可以跳过出多层嵌套
- break:直接跳出当前循环
三、shfit:
每次执行,都会把脚本参数中的第一个弹出。
四、循环列表:
- 直接写出列表:
- 命令生成
- {1..10},
- seq命令:
- 返回列表的命令:$(ls /data),`ls /data`
- 使用glob:例如:*.sh
- 引用变量:$@,$,(脚本中,“$@”,参数独立显示,“$”为参数数组)
五、示例:
1、for:
1.1、1..100求和:
#!/bin/bash
#写法1:
declare -i sum=0 #声明int变量
for i in {1..100};do
let sum+=i
done
echo sum=$sum
#写法2:
sum = 0
for ((i=1;i<=100,i++));do
let sum+=i
done
echo sum=$sum
1.2、1..100奇数求和:
#!/bin/bash
declare -i sum=0 #声明int变量
for i in {1..100};do
if [ $[i%2] -eq 1 ];then
let sum+=i
fi
done
echo sum=$sum
1.3、批量添加用户:
1、创建用户名文件
pi@raspberrypi:~/data $ cat userlist.txt
ifranc
baook
aston
kkoo
shuaiguo
2、脚本
#!/bin/bash
#添加10个用户,创建随机密码
for user in `cat ./userlist.txt`;do
pass=`tr -dc '[:alnum:]' < /dev/urandom | head -c 8` #获取随机8位数字作为密码
useradd $user &> /dev/null
echo "$user:$pass" | tee -a useradd.log | chpasswd #设置密码,将用户:密码写入文件
passwd -e $user
echo "User:$user is created"
done
1.4、将全部文件后缀修改为.abc:
#!/bin/bash
#修改文件夹内所有文件的扩展名为.abc
#设置目标文件目录
dir="/home/pi/data/test"
for file in `ls $dir`;do
mv $dir/$file $dir/$(echo $file | sed -r 's/(.*)\.(.*)/\1.abc/')
done
1.5、并行扫描指定网段内开机主机:
#!/bin/bash
Network=192.168.1
for HostID in {1..254};do
{
if ping -c1 -W1 $Network.$HostID &> /dev/null ;then
echo $Network.$HostID is up | tee -a hostlist.txt
fi
} & #{内程序并行运行}
done
wait #光标自动跳到命令行
1.6、九九乘法表:
#!/bin/bash
for i in {1..9};do
for j in `seq $i`;do
echo -e "$j*$i=$[j*i] \t\c" #\t table \c 不换行
done
echo #换行
done
1.7打印三角形:
#!/bin/bash
read -p "Please in put line-->" line
for((i=1;i<=line;i++));do
for((j=line-1;j>=i;j--));do
echo -e " \c"
done
for((k=1;k<=i*2-1;k++));do
echo -e "+\c"
done
echo
done
2、while:
2.1、循环10次随机数,打印最大值和最小值
#!/bin/bash
i=0
max=
min=
while [ $i -lt 10 ];do
tem=$RANDOM
echo $tem
if [ ! $max ];then
max=$tem;min=$tem
else
if [ $tem -gt $max ];then
max=$tem
elif [ $tem -lt $min ];then
min=$tem
fi
fi
let i++
done
echo Max=$max, Min=$min
特殊用法:
2.2、read配合while,利用管道输入:
[root@VM_0_17_centos ~]# echo a b c | while read x y z;do echo x=$x,y=$y,z=$z;done
x=a,y=b,z=c
2.3、读取文件重定向读取每行内容:
[root@VM_0_17_centos data]# cat f.txt
1 2 3
a b c
zz dd kk
sd fd gse #空格个数无所谓
[root@VM_0_17_centos data]# cat f.txt | while read x y z;do echo x=$x,y=$y,z=$z;done
x=1,y=2,z=3
x=a,y=b,z=c
x=zz,y=dd,z=kk
x=sd,y=fd,z=gse