shell脚本forloops&whileloops题解

一、for loops

for 变量名 in 列表;do
循环体
done
执行机制:
依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直
到列表中的元素耗尽,循环结束
列表生成方式:
(1) 直接给出列表
(2) 整数列表:
(a) {start..end}
(b) $(seq [start [step]] end)
(3) 返回列表的命令
$(COMMAND)
(4) 使用glob,如:.sh
(5) 变量引用;
$@, $

for loops c风格格式

双小括号方法,即((…))格式,也可以用于算术运算
双小括号方法也可以使bash Shell实现C语言风格的变量操作
I=10
((I++))
for循环的特殊格式:
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
do
循环体
done
控制变量初始化:仅在运行到循环代码段时执行一次
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做
条件判断

1、判断/var/目录下所有文件的类型

for files in   /var/* ;do
    if [[ -f $files ]];then
        echo "$files exists and is a regular file."
    elif [[ -h $files ]] ;then
        echo "$files is a symbolic link."
    elif [[ -d $files ]] ;then
        echo "$files is a directory."
    else
        echo "$files is others."
    fi
done

2、添加10个用户user1-user10,密码为8位随机字符

for user in user{1..10} ;do
    id $user &> /dev/null
    if [[ $? -ne 0 ]] ;then
        useradd $user
#openssl rand -base64 6  ; uuidgen |cut -c8
        pw=`openssl rand -base64 6`
        echo  $pw|passwd --stdin  $user &> /dev/null
        echo "user:$user, password : $pw" >> /root/pw_file
    else
        echo "Error:$user is exsit"
        exit
    fi
    if [ $user == "user10" ] ;then
        echo "user is created,password is in  /root/pw_File"                                                                                                           
    fi
done

#删除10个用户
for i in {1..10} ;do userdel -r user$i ;done

3、/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start


for files in /etc/rc.d/rc3.d/[KS]* ;do
    if [ `basename $files|cut -c1` == "K" ] ;then
        echo "$files stop"
    else
        echo "$files start"                                                                                                                                            
    fi
done

4、编写脚本,提示输入正整数n的值,计算1+2+…+n的总和

read -p "please input a positive integer: " INT
if [[ $INT =~ ^[0-9]+$ ]] && [[ `expr $INT` != 0 ]] ;then
    sum=0
    for i in `seq $INT`;do
        let sum+=i
    done
    echo "sum=$sum"
else
    echo "Error:your input is not positive integer"
fi

5、计算100以内所有能被3整除的整数之和

sum=0
for i in `seq 3 3 100` ;do
    let sum+=i
done
echo "sum=$sum"
for((i=3,sum=0; i<=100; i+=3,sum+=i));do
    echo -n                                                                                                                                                            
done
echo "sum:$sum"

6、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态

read -p "please input IP:" IP
IPC=`echo $IP |awk -F. '$1=255&&$2<=255&&$3<=255&&$4<=255{print "0"}'`
IPCHECK=`echo $IP |grep -Eo "^[0-9]{1,3}\.[0-9]{1,3}\."`
if echo $IP |grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" ;then
    echo "start>>>" >>/root/ipup.txt
    if [ $IPC -eq 0 ] ;then
        for IP1 in {0..254} ;do
            for IP2 in `seq 254`;do
                {
                ping -c1 -w1  $IPCHECK$IP1.$IP2 &> /dev/null
                [ $? -eq 0 ] && echo "The host $IPCHECK$IP1.$IP2  run up" >> /root/ipup.txt
                }&
            done
            wait
        done
    else
        echo "your IP $IP is not available"
    fi
else
    echo "your IP $IP format is wrong"
fi

7、打印九九乘法表

for i in {1..9};do
    for j in `seq $i`;do
        echo -en "$i*$j=$(($i*$j))\t"
    done
    echo
done

8、在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html

for i in {1..10};do
    NUM=`openssl rand -base64 6|tr -dc '[:alpha:]' |head -c10`
    touch /data/${i}${NUM}.html
done
unset NUM

9、打印等腰三角形

read -p "please input the triangle number: " NUM
for n in `seq $NUM` ;do
{
    for a in `seq $[$NUM-$n]` ;do
        echo -n " "
    done
    for b in `seq $[2*$n-1]` ;do
        color=$[RANDOM%7+31]
        echo -en  "\033[1;${color}m*\033[0m"
    done
    echo
}&
done

1.
1
2.
2
3.
3
4.
4
5.
5
6.
6
7.
7
8.
8

9.
9

while loops

while CONDITION; do
循环体
done
CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后
会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为
“false”终止循环
因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地
被修正
进入条件:CONDITION为true
退出条件:CONDITION为false

while循环的特殊用法(遍历文件的每一行):

while read line; do
循环体
done < /PATH/FROM/SOMEFILE
依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line

1、编写脚本,求100以内所有正奇数之和

declare -i i=1
declare -i sum=1
while [ $i -le 100 ] ;do
    let i+=2
    let sum+=i
done
echo sum=$sum

2、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态,并统计在线和离线主机各多少

IPNET=192.168.
i=0
tmp=/root/ping.txt
for ((i=0;i<=255;i++)) ;do                                                                                                                                             
    declare -i j=1
    while [ $j -le 254 ] ;do
    {   ping -c1 -w1 ${IPNET}${i}.${j} &> /dev/null
        if [ $? -eq 0 ] ;then
            let sumup++
            echo "${IPNET}${i}.${j} is up"|tee -a  $tmp
        fi }&
        let j++
    done
    wait
done
up=`cat $tmp |wc -l`
down=$[65024-$up]
echo "host up is $up"
echo "host down is $down"

3、编写脚本,打印九九乘法表

declare -i i=1
while [ $i -le 9 ] ;do
    declare -i j=1
    while [ $j -le $i ] ;do                                                       
        echo -en "${i}x${j}=$(($i*$j))\t"
        let j++
    done
    echo
    let i++
done

4、编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大值和最小值

file=/root/rand4.txt
declare -i i=1
if [ ! -f $file ] ;then
    >$file
else
    rm -f $file
fi 
while [ $i -le 10 ] ;do
        echo $RANDOM |tee -a $file
    let i++
done    
echo max `cat $file |sort -nr|head -n1`
echo min `cat $file |sort -nr|tail -n1`

5、编写脚本,实现打印国际象棋棋盘

默认背景色为黑色

clear
while read -p "please input a number(8,16,32,64):" num ;do
    if [[ $num =~ ^[0-9]{1,2}$ ]];then
        if [ $(($num%8)) -eq 0 ] ;then
            break
        fi
    else
        echo "Error:your input is illegal"
    fi
done
el=$[$num/4]
al=$[$num/8]
space=`seq $el |sed -r 's/\b[0-9]+\b//g'|tr "\n" " "`
for i in `seq $num`;do
    for j in {1..4};do
        if [[ $(($i%$el)) =~ ^[1-$al]$ ]] ;then
            echo -ne "\033[1;47m${space}\033[0m$space"
        else
            echo -ne "$space\033[1;47m${space}\033[0m"
        fi
    done
    echo
done

6、后续六个字符串:efbaf275cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机执行命令: echo $RANDOM|md5sum|cut –c1-10 后的结果,请破解这些字符串对应的RANDOM值

md5file=/root/rand_file
NUM="efbaf275cd 4be9c40b8b 44b2395c46 f8c8873ce0 b902c16c8b ad865d2f63"
i=1
if [ ! -f $md5file ];then
    while [ $i -le 65533 ];do
        j=`echo $i |md5sum |cut -c1-10`
        echo $j $i  >>$md5file
        ((i++)) 
    done
else
    for k in $NUM;do
        grep $k $md5file
    done
fi

1.
1

2.
2
3.
3
4.
4
5.
5
6.
6

转载于:https://blog.51cto.com/13698281/2114954

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值