【shell流程控制之for循环-05】

一、for循环

1.带列表的for循环

for variable in {list}
do
 statement1
 statement2
 ...
done

eg1:

[root@manager day5]# cat for1.sh 
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-20
#FileName:      for1.sh
#*************************************************************
#for v in 1 2 3 4 5
for v in {1..5}
do 
	echo -n  "$v"
done

[root@manager day5]# sh for1.sh 
12345[root@manager day5]#

eg2:

[root@manager day5]# cat for2.sh
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-20
#FileName:      for2.sh
#*************************************************************
for i in 192.168.131.{100..108}
do
	if ping $i -c 2 -w 0.2 -i 0.2 &>/dev/null
	then
		echo "$i 可达"
	else
		echo "$i 不可达"
	fi
done
[root@manager day5]# sh for2.sh
192.168.131.100 不可达
192.168.131.101 不可达
192.168.131.102 不可达
192.168.131.103 不可达
192.168.131.104 不可达
192.168.131.105 不可达
192.168.131.106 不可达
192.168.131.107 可达
192.168.131.108 不可达

eg3:获取当前目录下的文件名作为变量列表打印输出
#ls -F 路径 :可以显示哪些是目录哪些是文件

#!/bin/sh
for FILE in $(ls -F | grep -v /$)
do
  echo $FILE
done

ls -F 用法
eg4:

[root@manager day5]# sh sum1.sh
5050
[root@manager day5]# cat sum1.sh 
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-20
#FileName:      sum1.sh
#*************************************************************
for i in {1..100}
do
	let sum+=i  #加let,不加Let,+=等于拼接
done
echo $sum

eg5:批量创建用户

root@manager day5]# cat test1.sh 
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-20
#FileName:      test1.sh
#*************************************************************
#批量创建用户
#要求:
#用户名以test开头,按数字序号变化;
#一共添加30个账号,即test01,tes02...,test30
#密码为123456
#echo "用户:密码" | chpasswd
#echo 密码 | passwd --stdin 用户  
for i in user{01..05}
do
	if id $i &>/dev/null
	then
		echo "$i is exists"
	else
		echo "$i not is exists"
		useradd $i
		echo "$i:123456" | chpasswd
		echo "$i created"
	fi
done

修改用户密码推荐两种:
1.echo "用户:密码" | chpasswd
2.echo 密码 | passwd --stdin 用户

2.不带列表的for循环

for variable [$*]
do
 statement1
 statement2
 ...
done

eg1:

[root@manager day5]# cat test4.sh
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-21
#FileName:      test4.sh
#*************************************************************
for i
do
	echo $i
done
[root@manager day5]# sh test4.sh {1..6}
1
2
3
4
5
6

3.类C风格for循环语句

for ((expression1;expression2;expression3))
do
 statement1;
 statement2;
 ...
done

eg1:用C风格删除之前的user01-user30

[root@manager day5]# cat test2.sh 
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-20
#FileName:      test2.sh
#*************************************************************
#用C风格删除之前的user01-user30
for ((i=1;i<=30;i++))
do 
	if [ $i -le 9 ]
	then
		id user0$i &>/dev/null  && userdel -r user0$i
	else
		id user$i &>/dev/null && userdel -r user$i
	fi
done

#for ((i=1;i<=30;i++)
#do
#	if [ $i -le 9 ]
#	then
#		user=test0$i
#	else
#		user=test$i
#	fi
#	id $user &>/dev/null && userdel -r $user
#done

练习1:system1 上创建一个脚本,名为 /root/batchusers, 此脚本能实现为系统 system1 创,建本地用户,并且这些用户的用户名来自一个包含用户名列表的文件,同时满足以下要求:此脚本要求提供一个参数,此参数就是包含用户名列表的文件;如果没有提供参数,此脚本应该给出下面的提示信息 Usage: /root/batchusera userfile;然后退出并返回相应的值创建的用户登录 shell 为 /bin/false;此脚本不需要为用户设置密码

[root@manager day5]# cat test3.sh
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-20
#FileName:      test3.sh
#*************************************************************
if [ $# -eq 1 ]
then
	if [ $1 = "userfile" ]
	then
		for i in `cat $1`
		do
			if ! id $i &>/dev/null
			then
				useradd $i -s /bin/false
			fi				
		done
	else
		echo "输入的文件不是userfile"
		exit 3
	fi
else
	echo "Usage: /root/batchusera userfile"
	exit 3
fi
[root@manager day5]# cat userfile
zs
li
wmz

练习2:编写一个shell脚本,它把第二个位置参数及其以后的各个参数指定的文件复制到第一个参数指定的目录中;

[root@manager day5]# cat lx1.sh
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-21
#FileName:      lx1.sh
#*************************************************************
#编写一个shell脚本,它把第二个位置参数及其以后的各个参数指定的文件复制到第一个参数指定的目录中
dir_path=$1
echo $dir_path
num=$#
#间接变量(这个变量来源于$变量:$#/一个变量的值是第二个变量的名字):${!car_name}
for ((i=2;i<=$num;i++))
do
	#echo ${!i}
	cp ${!i}   $dir_path
done
ls $dir_path
[root@manager day5]# sh lx1.sh /1 test2.sh 
/1
for1.sh  for2.sh  q  test1.sh  test2.sh

间接变量引用:${!变量名} #这个变量来源于$变量:$#/一个变量的值是另一个变量的名字

v2="hello"
v1="v2"
echo ${!v1}

练习3:编写一个shell脚本,利用for循环将当前目录下的.c文件移动到指定的目录,并按文件大小排序移动后的目录

[root@manager day5]# cat lx2.sh
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-21
#FileName:      lx2.sh
#*************************************************************
#编写一个shell脚本,利用for循环将当前目录下的.c文件移动到指定的目录,并按文件大小排序移动后的目录
read -p "请输入指定目录路径:" answer
dir_path=$answer
for i in `ls *.c`
do
	mv $i $dir_path &>/dev/null | sort -n 
done
ls $dir_path
[root@manager day5]# sh lx2.sh
请输入指定目录路径:/1
1.c  2.c  3.c  4.c  for1.sh  for2.sh  q  test1.sh  test2.sh

练习4:编写脚本,输入一个数字n并计算1到这个数的总和。要求:如果这个数小于等于1,要求重新输入,直到输入大于1的数字为止;

[root@manager day5]# cat lx3.sh 
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-21
#FileName:      lx3.sh
#*************************************************************
#编写脚本,输入一个数字n并计算1到这个数的总和。要求:如果这个数小于等于1,要求重新输入,直到输入大于1的数字为止;
read -p "请输入一个整数:" num
while [ $num -le 1 ]
do
	read -p "您输入的数字小于等于1,请重新输入:" num
done

for ((i=1;i<=$num;i++))
do
	let sum+=$i
done
echo $sum
[root@manager day5]# sh lx3.sh 
请输入一个整数:3
6

练习5:编写一个shell脚本,打印任何数的乘法表。
例如,如果你执行此脚本,它应请求一个数,并显示它的表。显示例输出如下:
2
21 = 2
2
2 = 4

2*9 = 18

[root@manager day5]# cat lx4.sh
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-21
#FileName:      lx4.sh
#*************************************************************
#编写一个shell脚本,打印任何数的乘法表。
#	例如,如果你执行此脚本,它应请求一个数,并显示它的表。显示例输出如下:
#		2
#		2*1 = 2
#		2*2 = 4
#		…
#		2*9 = 18
read -p "请输入一个数字请求:" num
echo $num

for i in {1..9}
do
	s=$(($i*$num|bc))
	echo "$num*$i=$s" 
done
[root@manager day5]# sh lx4.sh
请输入一个数字请求:3
3
3*1=3
3*2=6
3*3=9
3*4=12
3*5=15
3*6=18
3*7=21
3*8=24
3*9=27

你可能感兴趣的:(shell)