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打印三角形:image-20200319204341072
#!/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
posted @ 2020-03-18 20:59  静静老公  阅读(782)  评论(0编辑  收藏  举报