shell循環之for、while、case

shell循環之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

        案例一:
vi  user.txt
Zsan
Lisi
:wq

vi  useradd_for.sh
#!/bin/bash
Un=$(cat /root/user.txt)
for  i  in  $Un
do
useradd $i 
echo  123123 |passwd  --stdin $i
done
:wq

chmod  +x  useradd_for.sh
./useradd_for.sh

案例二:檢查網絡中存活主機
vi  chk_net_alive_host.sh
#!/bin/bash
read  -p "please your want chk net:" NET
for  i  in  $(seq  1  254)
do
ping  -c 2 $NET.$i  &&echo "$NET.$i is  up."
done

案例三:檢查網絡中存活主機
vi chk_net_alive_host2.sh
#!/bin/bash
#by liwenhu 20160924                    ##註釋
ip=192.168.100.                         ##定義變量ip
for i in {1..254};do                    ##執行for循環語句,取值範圍爲1-254
  ping -c 2 -I eth0 $ip$i &>/dev/null     ##編寫循環體,使用ping命令測試網絡主機連通性
  if [ $? -eq 0 ];then                    ##使用if判斷語句,判斷ping命令的結果,若上條命令執行成功
    B=$(arping -I eth0 -f $ip$i |grep Unicast |awk '{print $5}')    ##若上條ping命令執行成功,證明此主機存在,定義變量B爲此主機的MAC地址
    echo "$ip$i is starting MAC=$B"         ##輸入結果和主機的MAC地址變量B到屏幕
  else                                    ##若ping命令執行不成功,證明主機不存在
    echo "$ip$i is stoping"
  fi
done

案例四:設置開機啓動服務
vi  ck.list
crond
iptables
network
sshd

vi  chk_ser_onboot_for.sh
#!/bin/bash
SL=$(cat /root/ck.list)
for i in $SL
do
        /etc/init.d/$i status |grep pid
        if [ $? -ne 0 ];then
                /etc/init.d/$i restart
        fi
        chkconfig $i on
done

案例五:序列列表:
vi  for_list.sh
#!/bin/bash
for  i  in  {vsftpd,dhcpd,named}
do
/etc/init.d/$i  restart
chkconfig $i  on
done
for  i  in  {1..254}
do
ping -c 2 192.168.100.$i
done

案例六:數組列表:
vi for-arry.sh 
#!/bin/bash
A=(crond gpm iptables lvm2-monitor network rsyslog sshd udev-post)
echo ${A[1]}
echo ${A[5]}
echo A arry length is ${#A[*]}
for i in ${A[*]};do
chkconfig --list $i
done

案例七:雙色球一等獎案例
vi shuangseqiu.sh
#!/bin/bash
>/tmp/num20.txt
for i in $(seq 1 20)
do expr $RANDOM % 33 + 1 >>/tmp/num20.txt
done
echo "第$(date +%Y)$(date +%s |tail -c 4)期開獎結果 開獎日期:$(date +%F)"
echo "==================================================================="
echo -e "\033[31m 紅球:$(cat /tmp/num20.txt |sort -n |uniq |head -6 |xargs echo) \033[0m"
echo -e "\033[34m 籃球:$(expr $RANDOM % 16 + 1) \033[0m"

二、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時,那麼條件表達式永遠爲假;

         案例一:創建用戶
[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

三、case循環:

概述:根據變量的值,順序匹配模式,匹配後執行命令並結束,如果沒有匹配的模式,則執行默認命令,執行成功後退出, 返回1,然後退出case;
語法:case "變量" in
模式1)
命令1
;;
模式2)
命令2
;;
*)
默認命令
exit 1
;;
esac
模式:[0-9]:大括號內-表示一個連續的範圍;
A|B:|表示或;

        案例一:交互式定義變量匹配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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章