打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
shell循环之for、while、case

一、for循环;

二、while循环;

三、case循环;

一、for循环:

概述:for循环根据指定的变量及变量取值列表,针对不同取值,重复执行命令,直到取值列表中的值全部用完,退出,for    循环适用于无规律的取值变量;

语法:for 变量名 in 变量取值列表 ;do

                重复执行的命令(循环体),应用到变量名

          done

变量取值列表:

        命令:cat、seq、awk等命令的屏幕输出结果,例:A=$(cat 1.txt)

        列表:直接在取值列表中定义内容

          1.{a..z}、{A..Z}、{1..10},直接在取值列表中定义内容;

          2.{a,b,c,d},直接在括号中写入内容;

          3.a b c d ,不用括号,直接用空格隔开每个值;

        数组:

          定义数组:数组名=(第0个数组值 第1个数组值)

          查看属组:echo ${数组名[数组的第n个位置]}                        ##显示数组中的第n个值

                           echo ${数组名[*]}                                                ##显示数组中的所有值

                           echo ${#数组名[*]}                                        ##显示数组中的值的个数

          在脚本中使用数组:举例

                #!/bin/bash

                A=(vsftpd named sshd)

                for i in ${A[*]};do

                  /etc/init.d/$i start

                done

二、while循环:

概述:重复测试某个条件,只要条件成立,就重复执行命令,条件不成立,立即退出,自带判断;

语法:while 条件测试操作 ;do

                重复执行的命令

          done

while循环体内常用的命令:

        let i++等于i=$(expr $i+1)                ##变量i每执行一次循环则加1;

        expr $RANDOM % 100                        ##取得100以内的随机数;

        sleep 2                                        ##休眠2秒,避免死循环真用过多的硬件资源;

退出while循环体的三种方式:

        条件为假退出循环体,继续执行循环体以外的命令;

        exit退出脚本,循环体外的命令不会执行;

        break退出脚本中的循环体,继续执行循环体外的命令;

特殊条件表达式:

         true :当条件表达式为true时,那么代表条件表达式永远成立,为真;

     false:当条件表达式为false时,那么条件表达式永远为假;

三、case循环:

概述:根据变量的值,顺序匹配模式,匹配后执行命令并结束,如果没有匹配的模式,则执行默认命令,执行成功后退出,    返回1,然后退出case;

语法:case "变量" in

          模式1)

                命令1

                 ;;

          模式2)

                命令2

                 ;;

          *)

                默认命令

                exit 1

                ;;

          esac

模式:[0-9]:大括号内-表示一个连续的范围;

          A|B:|表示或;

case循环

案例一:交互式定义变量匹配case

[root@ns bin]# cat key_hit_case.sh 

#!/bin/bash

read -p "Please hit a key:" KEY

case $KEY in

[a-z]|[A-Z])

echo "your key is alph." 

;;

[0-9])

echo "your key is num."

;;

*)

echo "your key may be is #!@ and so on."

exit 1

;;

esac

案例二:位置变量匹配case

[root@ns bin]# cat prog_case.sh 

#!/bin/bash

#chkconfig: - 98 10

#description: A script for case by linuxfan.cn.

case $1 in

start)

echo "hehe is starting."

sleep 2

;;

stop)

echo "hehe is stoping."

sleep 2

;;

restart)

$0 stop

$0 start

;;

*)

echo "Usage:$0 {start|stop|restart}"

exit 1

;;

esac

案例三:查看vsftpd服务的控制脚本

[root@ns bin]# vim vsftpd

#!/bin/bash

#

### BEGIN INIT INFO

# Provides: vsftpd

# Required-Start: $local_fs $network $named $remote_fs $syslog

# Required-Stop: $local_fs $network $named $remote_fs $syslog

# Short-Description: Very Secure Ftp Daemon

# Description: vsftpd is a Very Secure FTP daemon. It was written completely from

#              scratch

### END INIT INFO

# vsftpd      This shell script takes care of starting and stopping

#             standalone vsftpd.

#

# chkconfig: - 60 50     ##设置允许级别和开、关机的启动顺序

# description: Vsftpd is a ftp daemon, which is the program \

#              that answers incoming ftp service requests.

# processname: vsftpd

# config: /etc/vsftpd/vsftpd.conf

# Source function library.

. /etc/rc.d/init.d/functions

# Source networking configuration.

. /etc/sysconfig/network    

RETVAL=0

prog="vsftpd"

start() {    ##编写start函数,函数将许多的操作集成

        # Start daemons.

# Check that networking is up.

[ ${NETWORKING} = "no" ] && exit 1

[ -x /usr/sbin/vsftpd ] || exit 1

        if [ -d /etc/vsftpd ] ; then

                CONFS=`ls /etc/vsftpd/*.conf 2>/dev/null`

                [ -z "$CONFS" ] && exit 6

                PROC_FAILED=0

                for i in $CONFS; do

                        site=`basename $i .conf`

                        echo -n $"Starting $prog for $site: "

                        daemon /usr/sbin/vsftpd $i

                        RETVAL=$?

                        echo

                        if [ $RETVAL -eq 0 ] && [ ! -f /var/lock/subsys/$prog ]; then

                                touch /var/lock/subsys/$prog

                        elif [ $RETVAL -ne 0 ]; then

                                ps -FC vsftpd | grep "$i" > /dev/null

                                RETVAL=$?

                                if [ $PROC_FAILED -eq 0 ] && [ $RETVAL -ne 0 ]; then

                                        PROC_FAILED=1

                                fi

                        fi

                done

                if [ $RETVAL -eq 0 ] && [ $PROC_FAILED -ne 0 ]; then

                        RETVAL=1

                fi

        else

                RETVAL=1

        fi

        return $RETVAL

}

stop() {

        # Stop daemons.

        echo -n $"Shutting down $prog: "

        killproc $prog

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog

        return $RETVAL

}

# See how we were called.

case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  restart|reload)

        stop

        start

        RETVAL=$?

        ;;

  condrestart|try-restart|force-reload)

        if [ -f /var/lock/subsys/$prog ]; then

            stop

            start

            RETVAL=$?

        fi

        ;;

  status)

        status $prog

        RETVAL=$?

        ;;

  *)

        echo $"Usage: $0 {start|stop|restart|try-restart|force-reload|status}"

        exit 1

esac

exit $RETVAL

:wq

for循环

案例一:交互式定义变量匹配case

[root@ns bin]# cat key_hit_case.sh 

#!/bin/bash

read -p "Please hit a key:" KEY

case $KEY in

[a-z]|[A-Z])

echo "your key is alph." 

;;

[0-9])

echo "your key is num."

;;

*)

echo "your key may be is #!@ and so on."

exit 1

;;

esac

案例二:位置变量匹配case

[root@ns bin]# cat prog_case.sh 

#!/bin/bash

#chkconfig: - 98 10

#description: A script for case by linuxfan.cn.

case $1 in

start)

echo "hehe is starting."

sleep 2

;;

stop)

echo "hehe is stoping."

sleep 2

;;

restart)

$0 stop

$0 start

;;

*)

echo "Usage:$0 {start|stop|restart}"

exit 1

;;

esac

案例三:查看vsftpd服务的控制脚本

[root@ns bin]# vim vsftpd

#!/bin/bash

#

### BEGIN INIT INFO

# Provides: vsftpd

# Required-Start: $local_fs $network $named $remote_fs $syslog

# Required-Stop: $local_fs $network $named $remote_fs $syslog

# Short-Description: Very Secure Ftp Daemon

# Description: vsftpd is a Very Secure FTP daemon. It was written completely from

#              scratch

### END INIT INFO

# vsftpd      This shell script takes care of starting and stopping

#             standalone vsftpd.

#

# chkconfig: - 60 50     ##设置允许级别和开、关机的启动顺序

# description: Vsftpd is a ftp daemon, which is the program \

#              that answers incoming ftp service requests.

# processname: vsftpd

# config: /etc/vsftpd/vsftpd.conf

# Source function library.

. /etc/rc.d/init.d/functions

# Source networking configuration.

. /etc/sysconfig/network    

RETVAL=0

prog="vsftpd"

start() {    ##编写start函数,函数将许多的操作集成

        # Start daemons.

# Check that networking is up.

[ ${NETWORKING} = "no" ] && exit 1

[ -x /usr/sbin/vsftpd ] || exit 1

        if [ -d /etc/vsftpd ] ; then

                CONFS=`ls /etc/vsftpd/*.conf 2>/dev/null`

                [ -z "$CONFS" ] && exit 6

                PROC_FAILED=0

                for i in $CONFS; do

                        site=`basename $i .conf`

                        echo -n $"Starting $prog for $site: "

                        daemon /usr/sbin/vsftpd $i

                        RETVAL=$?

                        echo

                        if [ $RETVAL -eq 0 ] && [ ! -f /var/lock/subsys/$prog ]; then

                                touch /var/lock/subsys/$prog

                        elif [ $RETVAL -ne 0 ]; then

                                ps -FC vsftpd | grep "$i" > /dev/null

                                RETVAL=$?

                                if [ $PROC_FAILED -eq 0 ] && [ $RETVAL -ne 0 ]; then

                                        PROC_FAILED=1

                                fi

                        fi

                done

                if [ $RETVAL -eq 0 ] && [ $PROC_FAILED -ne 0 ]; then

                        RETVAL=1

                fi

        else

                RETVAL=1

        fi

        return $RETVAL

}

stop() {

        # Stop daemons.

        echo -n $"Shutting down $prog: "

        killproc $prog

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog

        return $RETVAL

}

# See how we were called.

case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  restart|reload)

        stop

        start

        RETVAL=$?

        ;;

  condrestart|try-restart|force-reload)

        if [ -f /var/lock/subsys/$prog ]; then

            stop

            start

            RETVAL=$?

        fi

        ;;

  status)

        status $prog

        RETVAL=$?

        ;;

  *)

        echo $"Usage: $0 {start|stop|restart|try-restart|force-reload|status}"

        exit 1

esac

exit $RETVAL

:wq

while、if脚本语句_价格竞猜

vi 价格竞猜.sh          ##编辑脚本文件

#!/bin/bash

p=$(expr $RANDOM % 1000)        ##设置随机生成在0-999之间的数字的变量p

t=0                             ##设置竞猜的初始次数0的变量t

echo "商品价格在0-999之间,祝你好运~~~(退出请输入exit)"      ##最初现在在屏幕上的内容

while true                      ##设置条件一直为真,循环执行循环体

do                              ##开始写循环体的内容

read -p "输入价格:" n          ##设置变量n,使用户手动输入变量内容

let t++                         ##使竞猜次数的变量t逐次加1

  if [[ $n = "exit" ]];then     ##输入的内容是exit,则退出,双层[[]]的作用是避免脚本执行中出现line 9: [: ==: unary operator expected错误

    exit 0 && echo "退出成功!!谢谢惠顾!!"

  fi

expr $n + 1 &>/dev/null         ##使用计算器计算用户竞猜的$n加1的值,将结果输入到黑洞,意义在于当$n为字符时,加1会出现错误值

  if [ $? != 0 ];then           ##if判断上条命令如果是错误的,返回值“”

    echo "请输入纯数字"

  elif [ -z $n ];then           ##if判断若竞猜价格变量$n字符串为空的话,返回值

    echo "输入的数字不能为空"

  elif [ $n -eq $p ];then       ##if判断$n等于实际价格$p的话,返回值“”,并且exit退出此脚本,显示一共猜测的次数

    echo "老铁,恭喜你,答对了。"

        if [ $t -ge 10 ];then

           echo -e "真尴尬,你猜的次数有点多。。。\n一共猜了$t次"

        else

           echo "非常棒,您一共输入了$t次。"

        fi

    exit 0

  elif [ $n -gt $p ] && [ $n -le 999 ];then     ##if判断$n大于实际价格$p时并且$n小于等于实际价格最大值999时

    echo "太高了"

  elif [ $n -lt $p ] && [ $n -ge 0 ];then       ##if判断$n小于实际价格$p时并且$n大于等于实际价格最小值0时

    echo "太低了"

  elif [ $n -gt 999 ] || [ $n -lt 0 ];then      ##if判断$n不在实际价格0-999之间时

    echo "请输入0-999之间的数字"

  fi                                            ##结束if的判断语句

done 

注意:在此脚本中,应用了while循环语句,if判断语句,和变量的知识,需要注意的时,在循环体中if判断时,注意条件的编写顺序;

while循环

案例一:创建用户

[root@ns bin]# cat useradd_while.sh

#!/bin/bash

PRE=stu

i=0

while [ $i -le 10 ];do

useradd $PRE$i

echo 123123 |passwd --stdin $PRE$i

userdel -r $PRE$i

#i=$(expr $i + 1)

let i++

done

案例二:猜价钱

[root@ns bin]# cat price_guess.sh 

#!/bin/bash

PRICE=$(expr $RANDOM % 1000)

TMS=0

echo "please insert a number like this(1-999)"

while true;do

read -p "please give number:" INT

let TMS++

if [ $INT -eq $PRICE ];then

echo "your luckly. right! "

echo "Your guess $TMS"

exit 0

elif [ $INT -gt $PRICE ];then

echo "Too High,try a again. "

else

echo "Too low,try a again."

fi

done

案例三:测试退出命令

[root@ns bin]# cat die_while.sh 

#!/bin/bash

i=0

j=$(expr $RANDOM % 10)

while true;do

echo $i

let i++

sleep 1   ##休眠1秒避免死循环产生

if [ $i -eq $j ];then

echo "ok,$j random"

break      ##将break替换为exit执行后查看效果

fi

done

df -hT

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Linux下的Nginx安装(开机自启动)
CentOS 6.4安装jdk+tomcat+mysql+nginx
Supervisor安装及配置
Centos 5下的Redis启动/关闭服务脚本
CentOS 7 Nginx 控制脚本「更新」
使用uWSGI+Nginx+Supervisor部署管理Django应用程序
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服