设为首页 收藏本站
查看: 2831|回复: 1

简单shell脚本编程示例(循环)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-8-19 09:51:42 | 显示全部楼层 |阅读模式
for循环

for 变量名in 列表;do
    循环体
done

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
for filename in /var/* ;do
    if [ -L "$filename" ] ;then
        echo "$filename is link file"
    elif [ -f "$filename" ];then
        echo "$filename is common file"
    elif [ -b "$filename" ];then
        echo "$filename is block file"
    elif [ -c "$filename" ];then
        echo "$filename is char file"
    elif [ -S "$filename" ] ;then
        echo "$filename is socket file "
    elif [ -d "$filename" ] ;then
        echo "$filename is directory"
    else
        echo "Unknow"
    fi
done



wKiom1e1U97hkL0GAABAGaiHgLw020.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
for f1 in /var/* ; do
    ff=`ls -ld $f1 | cut -c1`
    case $ff in
    l)
        echo "$f1 is link file"
    ;;
    b)
        echo "$f1 is blcok file "
    ;;
    c)
        echo "$f1 is char file"
    ;;
    s)
        echo "$f1 is socket file"
    ;;
    -)
        echo "$f1 is file"
    ;;
    d)
        echo "$f1  is dir"
    ;;
    *)
        echo "$f1  is other "
    esac
done



2、添加10个用户user1-user10,密码同用户名
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
#添加10个用户user1-user10,密码同用户名
for i in {1..10};do
id user$i &>/dev/null
    if [ $? -eq 0 ];then
        echo "user$i is exist"
    else
        useradd user$i
        echo "user$i" | passwd --stdin user$i &> /dev/null
        echo "Add user$i finished "
    fi  
done



wKioL1e1WxeDzR0NAAAyMsVsKbg899.png

删除上述用户
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
for i in {1..10} ; do
id user$i &> /dev/null
    if [ $? -eq 0 ];then
        userdel -r user$i
        echo "user$i is delete"
    else
        echo "user$i is not exist"
    fi  
done



3、/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的文件输出为文件加stop,以S开头的文件输出为文件名加start;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
#/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的文件输出为文件加stop,以S开头的文件输出为文件名加start;
for filename in /etc/rc.d/rc3.d/* ;do
  ff=`basename "$filename" | cut -c1`
    case $ff in  
    [Kk])
        echo "$filename stop"
    ;;  
    [Ss])
        echo "$filename start"
    ;;  
    *)  
        echo "other"
    esac
done



wKiom1e1Xg7xDxARAAAQmQEXreU427.png
4、写一个脚本,提示输入正整数n的值,计算1+2+3+…n的总和
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
read -p "please a number: " n1
if [[ $n1 =~ ^-?[[:digit:]]+$ ]];then
    if [ $n1 -gt 0 ];then
        sum=0
        for i in `seq $n1` ;do
        sum=$[$sum+$i]
        done   
        echo "sum is $sum"
    else
        echo "$n1 is not positive integer "
    fi  
else
    echo "need a number"
fi



wKiom1e1YvnTc0wZAAAu7ONKDjk568.png
5、写一个脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
read -p "Please input a IP :" ip
i=`echo $ip|cut -d. -f1-3`.
if [[ $ip =~  ^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]] ;then
    for j in {1..255} ;do
    ping -c1 -W1 $i$j &> /dev/null && echo "$i$j is on " || echo "$i$j is off "
    done
else
    echo "this is not IP"
fi
~



wKiom1e1Zc2hIkObAAA503Tnulo373.png
6、打印九九乘法表
1
2
3
4
5
6
7
8
#!/bin/bash
i=1
for i in {1..9};do
    for j in `seq $i` ;do
        echo -ne "$j*$i=$[$i*$j]        "
    done
    echo
done



wKioL1e1aELznNOnAAAqYwmQoKA497.png
while循环

while CONDITION; do
    循环体
done

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


1、求100以内所有正整数之和
1
2
3
4
5
6
7
8
#!/bin/bash
i=1
sum=0
while [ $i -le 100 ];do
    sum=$[$sum+$i]
    let i++
done
    echo "sum is $sum"



wKioL1e1ayCRMf4DAAAJMCKgsHQ978.png


2、通过ping命令探测172.16.250.1-254范围内的所有主机的在线状态,统计在线主机和离线主机各多少.
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

read -p "Please input IP " ip
i=`echo $ip | cut -d. -f1-3`.
j=0
if echo $ip | egrep "^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$" ;then
    while [ $j -le 255 ] ;do
        ping -c1 -W1 $i$j &> /dev/null  && echo "$i$j is on" ||     echo "$i$j is off"
        let j++
    done
else
    echo "This isn't IP"
fi




wKiom1e1bJ-wMpcoAAA0PcbsdVM973.png
3、打印九九乘法表
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
i=1
while [ $i -lt 10 ] ;do
    j=1
    while [ $j -le $i ] ;do
        echo -ne "$i*$j=$[$i*$j]        "
        let j++
    done
    echo
    let i++
done



wKiom1e1be-AH7O2AAAruAdrxvE147.png
4、利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大者和最小者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
i=1
a=$RANDOM
max=$a
min=$a
while [ $i -le 10 ];do
    [ $max -le $a ] && max=$a
    [ $min -ge $a ] && min=$a
    echo "$a"
    a=$RANDOM
    let i++
done
echo "max number is $max"
echo "min number is $min"
~



wKiom1e1dGaCT6wFAAAfaDZQCZs702.png
5、打印国际象棋棋盘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
i=1
while [ $i -le 8 ];do
     j=1
    while [ $j -le 8 ];do
        sum=$[$i+$j]
      n=$[$sum%2]
        if [ $n -eq 0 ];then
            echo -ne "  "
        else
            echo -ne "  "
        fi  
     let j++
    done
    let i++
    echo
done



wKiom1e1eH_ThwuhAAALvKZfmkg986.png
until循环
until CONDITION; do
    循环体
done

进入条件:CONDITION 为false
退出条件:CONDITION 为true

1、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并提示该用户退出系统。
1
2
3
4
5
6
7
#!/bin/bash
until who | grep  -q "^hacker>"   ; do
sleep 3
done
who| grep "^hacker>"| tr -s " " | cut -d " " -f3-5 >> /var/log/login.log
echo "you should logout" | mail hacker
echo "hacker is login"



wKiom1e1fiSBsk24AAASS1lYz9E786.png
2、随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
read -p "Guess number! Please enter a numer{0-10}: " n
if [[ $n =~ ^[[:digit:]]+$ ]] ;then
    i=$[$RANDOM%11]
    until [ $n -eq $i ] ; do
        if [ $n -gt $i ] ; then
            echo "It's too large "
        else
            echo "It's too small "
        fi  
        read -p "Try again:" n
    done
    echo "you are right!!!"
else
    echo "please input a number !!!"
fi



wKioL1e1gXygM0LZAAAdLdpd9rg068.png
1、写个脚本:打印等腰三角形
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
read -p "please input a line number " n
if [[ "$n" =~ ^[[:digit:]]+$ ]] ;then
    for i in `seq $n` ;do   
        for j in `seq $[$n-$i]`;do
            echo -n " "
        done
        for k in `seq $[$i*2-1]`;do
            echo -n "*"
        done
        echo
        let i++
    done
else
    echo "need a number!"
    exit 2
fi



wKioL1e1ghvDv1ggAAALsc9GI7Y890.png
2、用until循环实现国际象棋棋盘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
i=1
red="  "
yellow="  "
until [ $i -gt 8 ] ;do
    j=1
    until [ $j -gt 8 ] ;do
        sum=$[$i+$j]
        z=$[$sum%2]
        if [ $z -eq 0 ] ;then
            echo -ne "$red"
        else
            echo -ne "$yellow"
        fi  
        let j++
    done
    let i++
    echo
done



wKiom1e1goiwEvLDAAALKj-xgZU088.png


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-259905-1-1.html 上篇帖子: shell脚本中if与case使用,查找文件locate与find的使用,压缩... 下篇帖子: shell下的进度条和最大最小平均值

尚未签到

发表于 2018-8-23 15:59:34 | 显示全部楼层
大神厉害了

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表