列表for循环:用于将一组命令执行已知的次数,下面给出了for循环语句的基本格式:
for variable in {list}
do
command
command
…
done
或者
for variable in a b c
do
command
command
done
语法结构举例说明:
x1045 for var in {1..10};do echo $var;done
1046 for var in 1 2 3 4 5;do echo $var;done
1047 for var in `seq 10`;do echo $var;done
1048 for var in $(seq 10);do echo $var;done
1049 for var in {0..10..2};do echo $var;done
1050 for var in {2..10..2};do echo $var;done
1051 for var in {10..1};do echo $var;done
1052 for var in {10..1..-2};do echo $var;done
1055 for var in `seq 10 -2 1`;do echo $var;done
不带列表的for循环执行时由用户指定参数和参数的个数,下面给出了不带列表的for循环的基本格式:
xxxxxxxxxx
for variable
do
command
command
…
done
语法结构举例说明:
xxxxxxxxxx
#!/bin/bash
for var
do
echo $var
done
echo "脚本后面有$#个参数"
xxxxxxxxxx
for(( expr1; expr2; expr3 ))
do
command
command
…
done
expr1:定义变量并赋初值
expr2:决定是否进行循环(条件)
expr3:决定循环变量如何改变
语法结构举例说明:
xxxxxxxxxx
1068 for ((i=1;i<=5;i++));do echo $i;done
1069 for ((i=1;i<=10;i+=2));do echo $i;done
1070 for ((i=2;i<=10;i+=2));do echo $i;done
demo1:计算1到100的奇数之和,方法不止一种
xxxxxxxxxx
方法1:
#!/bin/bash
sum=0
for i in {1..100..2}
do
sum=$[$i+$sum]
done
echo "1-100的奇数和为:$sum"
方法2:
#!/bin/bash
sum=0
for ((i=1;i<=100;i+=2))
do
let sum=$i+$sum
done
echo "1-100的奇数和为:$sum"
方法3:
#!/bin/bash
sum=0
for ((i=1;i<=100;i++))
do
if [ $[$i%2] -ne 0 ];then
let sum=$sum+$i
fi
或者
test $[$i%2] -ne 0 && let sum=$sum+$i
done
echo "1-100的奇数和为:$sum"
方法4:
sum=0
for ((i=1;i<=100;i++))
do
if [ $[$i%2] -eq 0 ];then
continue
else
let sum=$sum+$i
fi
done
echo "1-100的奇数和为:$sum"
变量的调用:
$变量名 ${变量名}
$a ${a}
四则运算:
$((2%2)) $[2/2] let n=$i+$sum
命令优先执行:
$(命令) `命令`
循环控制: continue:继续。表示循环体内下面的代码不执行,重新开始下一次循环 break:打断。马上停止执行本次循环,执行循环体后面的代码 exit:表示直接跳出程序
demo2:输入一个正整数,判断是否为质数(素数) 质数:只能被1和它本身整除的数叫质数。 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
xxxxxxxxxx
思路:
1、如果能被其他数整除就不是质数——>$num%$i 是否等于0
2、如果输入的数是1或者2取模根据上面判断又不符合,所以先排除1和2
3、测试序列从2开始,输入的数是4——>得出结果$num不能和$i相等,并且$num不能小于$i
xxxxxxxxxx
#!/bin/bash
read -p "请输入一个正整数字:" number
[ $number -eq 1 ] && echo "$number不是质数" && exit
[ $number -eq 2 ] && echo "$number是质数" && exit
for i in `seq 2 $[$number-1]`
do
[ $[$number%$i] -eq 0 ] && echo "$number不是质数" && exit
done
echo "$number是质数" && exit
demo3:批量加5个新用户,以u1到u5命名,并统一加一个新组,组名为class,统一改密码为123
xxxxxxxxxx
#!/bin/bash
grep -w class /etc/group &>/dev/null
test $? -ne 0 && groupadd class
或者
groupadd class &>/dev/null
for ((i=1;i<=5;i++))
do
useradd -G class u$i && echo 123|passwd --stdin u$i
done
1、批量新建5个用户stu1~stu5,要求这几个用户的家目录都在/rhome.提示:需要判断该目录是否存在
xxxxxxxxxx
2、写一个脚本,局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里(如果例举整个网段的254个IP花的时间比较长,可以只分类10个ip192.168.1.10~20) 这只是一个局域网内机器检查通讯的一个思路。
xxxxxxxxxx
3、输入一个年份,判断是否是润年(能被4整除但不能被100整除,或能被400整除的年份即为闰年。)
xxxxxxxxxx
#!/bin/bash
read -p "Please input year:(2017)" year
if [ $[$year%4] -eq 0 -a $[$year%100] -ne 0 ];then
echo "$year is leap year"
elif [ $[$year%400] -eq 0 ];then
echo "$year is leap year"
else
echo "$year is not leap year"
fi
条件为真就退出循环;条件为假就死循环
xxxxxxxxxx
until expression [ 1 -eq 1 ] (( 1 >= 1 ))
do
command
command
...
done
示例1:使用until打印1-5
xxxxxxxxxx
示例2:使用until改写批量创建用户脚本
xxxxxxxxxx
条件为真就进入死循环;条件为假就退出循环
xxxxxxxxxx
while expression [ 1 -eq 1 ] (( 1 > 2 ))
do
command
command
...
done
xxxxxxxxxx
示例:
写一个30秒同步一次时间同步服务器10.1.1.1的脚本,如果同步失败,则进行邮件报警,每次失败都报警;同步成功,也进行邮件通知,但是成功100次才通知一次。
xxxxxxxxxx
#!/bin/bash
count=0
ntp=10.1.1.1
while true
do
rdate -s $ntp &>/dev/null
if [ $? -ne 0 ];then
echo "system date faild" |mail -s 'check system date' root@localhost
else
let count++
[ $count -eq 3 ] && echo "system date ok" |mail -s 'check date' root@localhost && count=0
fi
sleep 3
done
总结:
用至少三种方法打印1~5和5-1
xxxxxxxxxx
xxxxxxxxxx
bash默认有一个$RANDOM的变量 默认是0~32767。使用set |grep RANDOM 查看上一次产生的随机数
echo $RANDOM
产生0~1之间的随机数
echo $[$RANDOM%2]
产生0~2之间的随机数
echo $[$RANDOM%3]
产生0~3之间的随机数
echo $[$RANDOM%4]
。。。。
产生0~9内的随机数
echo $[$RANDOM%10]
产生0~100内的随机数
echo $[$RANDOM%101]
产生50-100之内的随机数
echo $[$RANDOM%51+50]
产生三位数的随机数
echo $[$RANDOM%900+100]
xxxxxxxxxx
#!/bin/bash
rm -rf phonenum.txt
for i in `seq 1000`
do
n1=$[$RANDOM%10]
n2=$[$RANDOM%10]
n3=$[$RANDOM%10]
n4=$[$RANDOM%10]
n5=$[$RANDOM%10]
n6=$[$RANDOM%10]
n7=$[$RANDOM%10]
n8=$[$RANDOM%10]
echo "139$n1$n2$n3$n4$n5$n6$n7$n8" >> phonenum.txt
done
思路:
xxxxxxxxxx
#!/bin/bash
for ((i=1;i<=5;i++))
do
file=phonenum.txt
line=`cat phonenum.txt |wc -l`
luckline=$[$RANDOM%$line+1]
phone=`cat phonenum.txt|head -$luckline|tail -1`
echo "幸运观众为:${phone:0:3}****${phone:7:4}"
#sed -i "/$phone/d" $file
done
思路:
xxxxxxxxxx
一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。在外部循环的每次执行过程中都会触发内部循环,直至内部完成一次循环,才接着执行下一次的外部循环。for循环、while循环和until循环可以相互嵌套。
demo1:打印如下图案
xxxxxxxxxx
1
12
123
1234
12345
demo2:打印如下图案
xxxxxxxxxx
5
54
543
5432
54321
54321
5432
543
54
5
课堂练习:打印九九乘法表(三种方法)
xxxxxxxxxx
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
xxxxxxxxxx
1、将/etc/passwd里的用户名分类,分为管理员用户,系统用户,普通用户。 2、写一个倒计时脚本,要求显示离2018年6月18日(端午节)的凌晨0点,还有多少天,多少时,多少分,多少秒。 3、写一个脚本把一个目录内的所有空文件都删除,最后输出删除的文件的个数。
xxxxxxxxxx