设为首页 收藏本站
查看: 1761|回复: 0

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

[复制链接]
累计签到:29 天
连续签到:1 天
发表于 2018-8-27 11:20:49 | 显示全部楼层 |阅读模式
  for循环
  for 变量名in 列表;do
  循环体
  done
  执行机制:
  依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束
  列表生成方式:
  (1) 直接给出列表
  (2) 整数列表:
  (a) {start..end}
  (b) $(seq[start [step]] end)
  (3) 返回列表的命令
  $(COMMAND)
  (4) 使用glob,如:*.sh
  (5) 变量引用;
  $@, $*
  1、判断/var/目录下所有文件的类型
  ①
#!/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
DSC0000.png

  ②
#!/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,密码同用户名
#!/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
DSC0001.png

  ②
  删除上述用户
#!/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;
#!/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
DSC0002.png

  4、写一个脚本,提示输入正整数n的值,计算1+2+3+…n的总和
#!/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
DSC0003.png

  5、写一个脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态
#!/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
  
~
DSC0004.png

  6、打印九九乘法表
#!/bin/bash  
i=1
  
for i in {1..9};do
  
    for j in `seq $i` ;do
  
        echo -ne "$j*$i=$[$i*$j]\t"
  
    done
  
    echo
  
done
DSC0005.png

  for循环特殊用法:
  双小括号方法,即((…))格式,也可以用于算术运算
  双小括号方法也可以使bash Shell实现C语言风格的变量操作
  #I=10
  #((I++))
  for循环的特殊格式:
  for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
  do
  循环体
  done
  控制变量初始化:仅在运行到循环代码段时执行一次
  控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断
#!/bin/bash  
for (( i=1;i /dev/null
  
    echo "$name  GECOS change successfully"
  
    fi
  
done < /etc/passwd
   DSC0006.png
  
  
  until循环
  until CONDITION; do
  循环体
  done
  进入条件:CONDITION 为false
  退出条件:CONDITION 为true
  1、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并提示该用户退出系统。
#!/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"
   DSC0007.png
  2、随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出。
#!/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
DSC0008.png

  1、写个脚本:打印等腰三角形
#!/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
DSC0009.png

  2、用until循环实现国际象棋棋盘
#!/bin/bash  
i=1
  
red="\033[41;1m  \033[0m"
  
yellow="\033[43;1m  \033[0m"
  
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
DSC00010.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.iyunv.com/thread-557252-1-1.html 上篇帖子: 自动化安装DHCP服务_shell 下篇帖子: shell下的进度条和最大最小平均值
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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