1、for循环
for 变量名 in 列表;do
循环体
done
执行机制:依次将列表中元素赋值给“变量名”;每次赋值后即执一次循环体;直到列表中元素耗尽循环结束
列表生成方式:
(1) 直接给出列表
(2) 整数列表:
(a){start..end}
(b) $(seq [start [step]] end)
(3) 返回列表的命令
$(COMMAND)或者`COMMAND`
(4) 使用glob,如:/root/bin/*.sh
(5) 变量引用;
$@, $*
2、while循环
while CONDITION; do
循环体
done
CONDITION(循环控制条件);进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环,因此CONDTION 一般应该有循环控制变量,而此变量的值会在循环体中不断地被修正
进入条件:CONDITION为true
退出条件:CONDITION为false
1、 until循环
until CONDITION; do
循环体
done
进入条件:CONDITION为false
退出条件:CONDITION为true
2、 循环控制语句continue
用于循环体中
continue [N]:最内层为第1层,提前结束第N层的本轮循环,而直接进入下一轮判断
示例1:添加用户时,若某用户如user2存在,则结束当次if-fi,进入下一个用户user3的if-fi循环
#!/bin/bash
for username in user{1..10};do
if grep "^$username\>" /etc/passwd;then
continue
else
useradd $username
echo $username|passwd –stdin $username
fi
done
示例2:#!/bin/bash
i=0
until false;do
echo $i;let i++;sleep 1;[ $i -eq 10 ] && continue;echo xx
done
输出的10后面没有xx,紧接着就输出11xx、12xx等等
由于sleep命令,例如0单独一次输出,而后是xx1一块输出,接着是xx2一块输出等等
3、 循环控制语句break
用于循环体中
break [N]:提前结束第N 层整层循环,最内层为第1层
示例1:当输出9时,break所在的整层until循环结束,但是until外的echo xxxhhh命令仍然会执行,所有最后输出1-9和xxxhhh
#!/bin/bash
i=1
until false ;do
[ $i -eq 10 ] && break
echo $i
let i++
done
echo xxxhhh
4、 创建无限循环
while true; do
循环体
done
until false; do
循环体
done
练习题:
1、 判断/var/目录下所有文件的类型
第一种方法:
#!/bin/bash
for file in `ls -A /var`;do
if [ -h /var/$file ];then
echo "the file is link"
elif [ -d /var/$file ];then
echo "the file is directory"
elif [ -f /var/$file ];then
echo "the file is commen"
else
echo "the file is other"
fi
done
第二种方法:
脚本filetype.sh
#!/bin/bash
read -p "please input the file path:" a
[ ! -e $a ] && echo "the file not exist" && exit
if [ -h $a ];then
echo "this file is link"
elif [ -d $a ];then
echo "this file is directory"
elif [ -f $a ];then
echo "this file is commen"
else
echo "this file is other"
fi
脚本filevartype1.sh
#!/bin/bash
for file in `ls -A /var`;do
echo /var/$file |./filetype.sh
done
注意其中调用脚本时应写处调用脚本的绝对路径或者相对路径
2、 添加10个用户user1-user10 ,密码同用户名
#!/bin/bash
for username in user{1..10};do
if grep "^$username\>" /etc/passwd;then
continue
else
useradd $username;echo $username|passwd –stdin $username
fi
done
3、/etc/rc.d/rc3.d 目录下分别有多个以K 开头和以S 开头的文件;分别读取每个文件,以K开头的文件输出为文件加stop,以S 开头的文件输出为文件名加start
“K34filename stop”
“S66filename start”
#!/bin/bash
for file in `ls -A /etc/rc.d/rc3.d`;do
if echo $file |grep "^K" >>/dev/dull;then
echo "$file stop"
elif echo $file|grep "^S" >>/dev/dull;then
echo "$file start"
else
echo "$file other"
fi
done
4、 写 一个脚本,提示输入正整数n 的值,计算1+2+3+…n的总和
#!/bin/bash
sum=0
read -p "please input the positive integer:" a
for i in `seq 1 $a`;do
sum=$[sum+i]
done
echo "the total is $sum"
5、 写一个脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态
#!/bin/bash
read -p "please input the ip:" a
b=`echo $a|grep -o "^.*\."`
sumtrue=0
sumfalse=0
for ip in {230..255};do
ping -c1 -W1 $b$ip &>/dev/dull && let sumtrue++ || let sumfalse++
done
echo "the ip is on:$sumtrue"
echo "the ip is off:$sumfalse"
6、打印九九乘法表
#1/bin/bash
b=0
for i in {1..9};do
let b++
for j in `seq 1 $b`;do
echo -en "$j*$i=$[j*i] \t" 内层循环不换行,但是在每次循环输出后面插入tab
done
echo 外层循环一次换一次行
done
1 、求100以内所有正整数之和
#!/bin/bash
i=1
sum=0
while [ $i -le 100 ];do
sum=$[sum+i]
let i++
done
echo "the total is $sum"
2 、通过ping 命令探测10.1.252.230-254 范围内的所有主机的在线状态,统计在线主机和离线主机各多少
#!/bin/bash
b=`echo "10.1.252.0"|grep -o "^.*\."`
sumtrue=0
sumfalse=0
id=230
while [ $id -le 254 ];do
ping -c1 -W1 $b$ip &>/dev/dull && let sumtrue++ || let sumfalse++
let id++
done
echo "the ip is on:$sumtrue"
echo "the ip is off:$sumfalse"
3 、打印九九乘法表
#!/bin/bash
b=1
i=1
while [ $i -le 9 ];do
j=1 注意j的初始值应该赋予此处,每次开始执行内循环时,j的值都从1开始
while [ $j -le $b ];do
echo -en "$j*$i=$[j*i] \t"
let j++
done
let b++
let i++
echo
done
4 、利用变量RANDOM生成10 个随机数字,输出这个10 数字,并显示其中的最大者和最小者
#!/bin/bash
i=1
maxa=$RANDOM
mina=$maxa
echo $maxa
while [ $i -le 9 ];do
mid=`echo $RANDOM`
echo $mid
if [ $mid -ge $maxa ];then
maxa=$mid
elif [ $mid -le $mina ];then
mina=$mid
fi
let i++
done
echo "the max is $maxa"
echo "the min is $mina"
5、打印国际象棋棋盘
#!/bin/bash
i=1
while [ $i -le 8 ];do
j=1
while [ $j -le 8 ];do
a=$[i%2]
b=$[j%2]
if [ $a -gt $b -o $a -lt $b ];then
echo -en "\033[40m \033[0m"
let j++
elif [ $a -eq $b ];then
echo -en "\033[47m \033[0m"
let j++
fi
done
let i++
echo
done
1、 求100 以内所有正整数之和
#!/bin/bash
i=1
sum=0
until [ $i -gt 100 ];do
sum=$[sum+i]
let i++
done
echo "the total is $sum"
2、 通过ping 命令探测10.1.252.230-254 范围内的所有主机的在线状态,统计在线主机和离线主机各多少
#!/bin/bash
b=`echo "10.1.252.0"|grep -o "^.*\."`
sumtrue=0
sumfalse=0
id=199
until [ $id -gt 254 ];do
ping -c1 -W1 $b$ip &>/dev/dull && let sumtrue++ || let sumfalse++
let id++
done
echo "the ip is on:$sumtrue"
echo "the ip is off:$sumfalse"
3、 打印九九乘法表
#!/bin/bash
b=1
i=1
until [ $i -gt 9 ];do
j=1
until [ $j -gt $b ];do
echo -en "$j*$i=$[j*i] \t"
let j++
done
let b++
let i++
echo
done
4、 利用变量RANDOM 生成10 个随机数字,输出这个10 数字,并显示其中的最大者和最小者
#!/bin/bash
maxa=$RANDOM
mina=$maxa
echo $maxai
until [ $i -ge 10 ];do
mid=`echo $RANDOM`
echo $mid
if [ $mid -ge $maxa ];then
maxa=$mid
elif [ $mid -le $mina ];then
mina=$mid
fi
let i++
done
echo "the max is $maxa"
echo "the min is $mina"
5、打印国际象棋棋盘
#!/bin/bash
i=1
until [ $i -gt 8 ];do
j=1
until [ $j -gt 8 ];do
a=$[i%2]
b=$[j%2]
if [ $a -gt $b -o $a -lt $b ];then
echo -en "\033[40m \033[0m"
let j++
elif [ $a -eq $b ];then
echo -en "\033[47m \033[0m"
let j++
fi
done
let i++
echo
done
原创文章,作者:18612763863,如若转载,请注明出处:http://www.178linux.com/37063