1. 程式人生 > >Shell版本迴圈語句(if//for/while/case)

Shell版本迴圈語句(if//for/while/case)

if選擇結構

if單分支處理:當“條件成立”時執行命令序列xx,否則,不執行任何操作(只判斷為真

   if [條件測試] ; then

      命令序列xx

fi

示例:檢測/media/cdrom目錄,若不存在則建立

    #!/bin/bash

    MOUNT_DIR="/media/cdrom/"

    if [ ! -d $MOUNT_DIR ] ;  then

        mkdir -p $MOUNT_DIR

    fi 

示例:每分鐘判斷當前登陸使用者是否超過3人,若超過3人,自動傳送郵件給root,報警!

#!/bin/bash

num=$(who |wc -l)

if [ $num -gt 3 ];then

        mail -s Warning [email protected] < /root/mail.txt

    mail -s Warning root < /root/mail.txt

fi

思路:1.計算登陸使用者

2.判斷使用者是否大於3,如果大於,則傳送郵件

3.chmod +x test.sh

4.將指令碼放到計劃任務內:crontab -e

* * * * * /root/test.sh

示例:如果是管理員,執行所有命令

#!/bin/bash

if [ $USER == root ];then

yum -y install vsftpd

systemctl start vsftpd

systemctl enable vsftpd`

fi

###############################################################################

if 雙分支處理:當“條件成立”時執行命令序列xx,否則,執行命令序列yy(非對即錯

if [條件測試] ; then

    命令序列xx

else

    命令序列yy

fi

示例:檢測並判斷指定的主機是否可ping通。使用者輸入IP地址,判斷是否能ping通。能則輸出ip地址up;不能則輸出ip地址down。

為了節省ping測試時間,可以只發送3個測試包(-c 3)、縮短髮送測試包的間隔秒數(-i 0.2)、等待反饋的超時秒數(-W 3)。

#!/bin/bash

read -p '請輸入您要測試的IP地址:' ip

ping  -c 2 -i 0.1 -W 2 $ip &> /dev/null

if [ $? -eq 0 ] ; then

echo "Host $ip is up."

else

echo "Host $ip is down."

fi

# chmod +x pinghost.sh

# ./pinghost.sh 192.168.4.5

示例:判斷使用者輸入的使用者名稱,該使用者是否存在,存在則輸出使用者id基本資訊,不存在則建立此使用者

#!/bin/bash

read -p '請輸入您的使用者名稱:' user

id $user &> /dev/null         或使用useradd $user 

if [ $? -eq 0 ];then

   echo 使用者已經建立

else

   echo 使用者已存在

   id $user

fi

###############################################################################

if 多分支處理:當條件1滿足時,作xx處理;否則繼續檢查

條件2,若成立則作yy處理;否則,作zz處理

相當於多層if語句巢狀,針對多個條件分別執行不同的操作

if [條件測試1] ; then

    命令序列xx

elif 條件測試2 ; then

命令序列yy

 .. ..

else 

      命令序列zz

fi

指令碼的退出狀態:取決於退出前最後一條命令的 $? 值,或者“exit 整數值”指定。

示例:猜數字遊戲:

#!/bin/bash

num=$[RANDOM%100]

for i in {1..10}               

do

read -p "請輸入一個範圍在「0-99」的數字:  "  guess

if [ $num -eq $guess  ];then

echo "你猜對了,恭喜您!!!"

echo "隨機數為:$num;         您猜的數字為:$guess"

echo "恭喜,猜對了,猜了$i次"

exit

elif [ $num -lt $guess ];then

echo "您猜錯了,您輸入的數字比隨機數大,您猜了$i次"

echo "您猜的數字為:$guess"

else

echo "您猜錯了,您輸入的數字比隨機數小,您猜了$i次"

echo "您猜的數字為:$guess"

fi

done

示例:從鍵盤讀取一個論壇積分,判斷論壇使用者等級

大於等於90 神功絕世

大於等於80,小於90 登峰造極

大於等於70,小於80 爐火純青

大於等於60,小於70 略有小成

大於60 初學乍練

    #!/bin/bash

    read -p "請輸入積分(0-100):" JF

    if [ $JF –ge 90 ] ; then

        echo "$JF 分,神功絕世"

    elif [ $JF –ge 80 ] ; then

        echo "$JF 分,登峰造極"

    elif [ $JF –ge 70 ] ; then

        echo "$JF 分,爐火純青"

    elif [ $JF –ge 60 ] ; then

        echo "$JF 分,略有小成"

    else

        echo "$JF 分,初學乍練"

    fi

# chmod +x gradediv.sh

# ./gradediv.sh 

示例:輸入一個分數,判斷成績分檔:85-100優秀、70-84良好、低於70分不合格

#!/bin/bash

read  -p  '請輸入您的分數(0-100):'  FS

if [ $FS -ge 85 ] && [ $FS -le 100 ];then

  echo “ $FS分!優秀 ”

elif [ $FS -ge 70 ] && [ $FS -le 84 ];then

  echo “ $FS分!合格 ”

else

  echo “ $FS分!不合格 ”

fi

示例:當執行/root/foo.sh redhat,輸出為fedora;當執行/root/foo.sh fedora,輸出為redhat;當沒有任何引數或者引數不是 redhat 或者 fedora時,其錯誤輸出產生以下資訊: /root/foo.sh redhat|fedora

1)編寫指令碼程式碼# vim  /root/foo.sh

    #!/bin/bash

    if [ "$1" == "redhat" ]  

    then

           echo "fedora"

    elif [ "$1" == "fedora" ] 

    then

           echo "redhat"

    else

           echo "/root/foo.sh redhat|fedora" >&2

fi

另一種寫法:

if [ $# == 0 ];then

echo '/root/foo.sh redhat |fedora' >&2    #為了對錯誤輸出進行收集,可通過2>file檢視

elif [ $1 == redhat ];then

     echo fedora

elif [ $1 == fedora ];then

     echo redhat

else 

     echo '/root/foo.sh redhat |fedora' >&2

fi

2)新增x執行許可權# chmod  +x  /root/foo.sh 

3) 測試提供正確引數的情況  # /root/foo.sh  redhat  

測試提供非預期引數的情況# /root/foo.sh  ubuntu

    測試不提供引數的情況 # /root/foo.sh

###############################################################################

列表式迴圈——給定一批物件,反覆執行類似的操作(如購票者==>售票)

for迴圈處理

遍歷/列表式迴圈:根據變數的不同取值,重複執行xx處理

列表式for迴圈結構:

    for  變數名  in  值1  值2  值3 .. .. (變數名一般習慣用i)

    do

            命令序列($變數名)

    done

造數:{1..50}     例:touch {01..10}.txt

#!/bin/bash

for i in {1..10} 

do 

  useradd stu$i 

  echo 123456 | passwd --stdin stu$i &> /dev/null

  echo stu$i建立成功

   id  test$a

done

示例:編寫一個批量新增使用者指令碼,此指令碼要求提供使用者名稱列表檔案作為引數,列表測試檔案:http://classroom/pub/materials/userlist。如果沒有提供引數,此指令碼應該給出提示 Usage: /root/batchusers,退出並返回相應值;如果提供一個不存在的檔案,此指令碼應該給出提示 Input file not found,退出並返回相應值

1)編寫指令碼程式碼# vim  /root/batchusers

    #!/bin/bash

    if [ $# -eq 0 ] ; then  //判斷位置變數為0個

        echo ‘Usage: /root/batchusers’ >&2    //將正確資訊變成錯誤資訊

        exit 1                                  //退出返回值為1

    fi

    if [ -f $1 ] ; then //文字不存在為真

        echo ‘Input file not found’ >&2       //將正確資訊變成錯誤資訊

        exit 2                                  //退出返回值為2

    fi

    for name in $(cat $1)//$1為檔案,cat $1可以顯示為文字引數,$()傳遞引數

    do

        useradd  -s  /bin/false  $name

    done

2)新增x執行許可權# chmod  +x  /root/batchusers 

3)測試batchusers批量新增使用者指令碼

下載使用者列表測試檔案: 

# wget  http://classroom/pub/materials/userlist -O  /root/userlist            

 # cat  /root/userlist          //檢查下載檔案

實現批量新增使用者:# /root/batchusers  /root/userlist      

 # id  duanwu

測試其他異常處理: 

# /root/batchusers   //未提供列表檔案, Usage: /root/batchusers <userfile>          # echo  $?      //返回1     

# /root/batchusers  /root/userlist.txt   //提供的列表檔案找不到,Input file not found       

# echo  $?       //返回2

###############################################################################

根據輸入成績的分數 輸出不同的提示資訊

把指定的檔案備份到指定的目錄下

判斷使用者從鍵盤輸入的資料是偶數還是奇數?

計算使用者輸入1-10之間的任意一個數的平方值,不輸入數字的時候給出錯誤提示資訊。

+++++++++++++++++++++++++++++++++

造數:{1..10}、 seq 5 、 seq 5 10

[[email protected] ~]# cat zaoshu.sh

#!/bin/bash

for i in `seq 10000`

do 

touch /tmp/$i.txt

done

###############################################################################

迴圈結構

在Shell指令碼應用中,常見的for迴圈採用遍歷式、列表式的執行流程,通過指定變數從值列表中迴圈賦值,每次複製後執行固定的一組操作。

for迴圈的語法(格式1)

for 變數名 in 值列表

do

命令序列

done

示例:批量新增使用者帳號(名稱沒有規律)

素材:/root/users.txt

編寫指令碼:

#!/bin/bash

ULIST=$(cat /root/users.txt)

for UNAME in $ULIST

do

useradd $UNAME  2>/var/err/log

echo "123456" | passwd --stdin $UNAME > /dev/null

done

# chmod +x uaddfor.sh 

# ./uaddfor.sh

示例:使用迴圈ping測試網路中所有主機

#!/bin/bash

net=192.168.4.

for i in `seq 1 254`  #反引號     //{1..254}

do

ping -c 3 -i 0.2 -w 0.2 $net$i &>/dev/null

if [ $? -eq 0 ];then

     echo "該主機$net$i,ping通"

else

echo "該主機$net$i,無法ping通"

fi

done

C語言風格的for迴圈(格式2)

通過變數控制,條件成立時迴圈;步長可控次數

for ((初值;條件;步長控制))

do

命令序列

done

示例:#!/bin/bash

for ((i=1;i<=5;i+=2))         //或for ((i=1;i<=5;i++))

do

echo $i

done

示例:製作9*9乘法表

#!/bin/bash

for ((i=1;i<=9;i++))

do

     for ((j=1;j<=$i;j++))

     do

        echo -n "$i*$j=$((i*j))"

     done

 echo

done

++++++++++++++++++++++++

字型色:echo -e "\033[34mOK\033[0m"

背景色:echo -e "\033[44mOK\033[0m"

for  第一個人  in  張三  李四  王五  .. ..

do

為第一個人採血

done

for  第一個人  in  $(cat  使用者列表檔案)

do

為第一個人採血

done

for  第一個人  in  $(cat  $1)

do

為第一個人採血

done

for  NAME  in  $(cat  $1)

do

useradd   -s  /bin/false  $NAME

done

+++++++++++++++++++++++++++++++++

while迴圈格式

——條件式迴圈:反覆測試條件,只要成立就執行命令序列

while迴圈屬於條件式的執行流程,會反覆判斷指定的測試條件,只要條件成立即執行固定的一組操作,直到條件變化為不成立為止。所以while迴圈的條件一般通過變數來進行控制,在迴圈體內對變數值做相應改變,以便在適當的時候退出,避免陷入死迴圈。

while 條件測試

do

    命令序列

done

for迴圈的迴圈次數根據值列表而固定,而while迴圈的迴圈次數不固定

+++++++++++++++++++++++++++++++++

示例:批量新增使用者(名稱有規律)

#!/bin/bash

PREFIX=”stu”; i=1                         //定義使用者名稱字首

while [ $i -le 20 ]

do

    useradd ${PREFIX}$i               //新增的使用者名稱為:字首+編號           

echo “123456” | passwd --stdin ${PREFIX}$i &> /dev/null

let i++ //遞增控制,避免死迴圈

done

# chmod +x uaddwhile.sh 

# ./uaddwhile.sh

# grep ^stu /etc/passwd              //檢查新增的使用者

批量刪除使用者賬號udelwhile.sh

將上一示例的命令改為

    userdel -r ${PREFIX}$i &> /dev/null

    let i++

# grep ^stu /etc/passwd                  //再檢查已無相應賬號資訊

示例:檢測192.168.4.0/24網段,列出不線上的主機地址

#!/bin/bash

NET="192.168.4."   ; i=1

while [ $i -le 254 ]

do

    IP="${NET}$i"

    ping -c 3 -i 0.2 -W 1 $IP &> /dev/null

    if [ $? -eq 0 ] ; then

        echo "Host $IP is up."

    else

        echo "Host $IP is down."

    fi

    let i++

done

示例:猜數字

#!/bin/bash

#這是一個猜數字的遊戲

biggest=10        #(代表取資料的最大值)

guess=0           #(玩家輸入的數字)

guesses=0         #(輸入數字的次數)

number=$(($$ % $biggest))   #random number, between 1 and $biggest,$$代表當前指令碼執行的PID,可以當作以一個隨機數

while [ $guess -ne $number ]

do 

echo -n "Guess?" ; read guess

if [ $guess -lt $number ];then

echo "...猜小了!"

elif [ $guess -gt $number ];then

echo "...猜大了!"

fi

guesses=$(($guesses + 1))

done

echo "猜對了!!!Guessed $number in $guesses guesses."

exit 0

#echo -n 迴避換行

#guess=0,定義一個變數,這裡存在bug,如果guess取值為0,會出錯

+++++++++++++++++++++++++++++

死迴圈

while :                  while True

do                               do

    命令                             命令

done                              done

+++++++++++++++++++++++++++++

示例:猜數字

#!/bin/bash

num=$[RANDOM%100+1]  ;i=0

while :

do

read -p "請輸入一個數字,範圍為[1-100]:" guess

let i++

if [ $guess -eq $num ];then

        echo “蒙對了,猜了$i次”

        exit

elif [ $guess -gt $num ];then

        echo “蒙大了”

else

        echo “蒙小了”

fi

done

示例:點名器,螢幕隨機刷人名(1-n行數)

#!/bin/bash

user=/root/users.txt

while :

do

clear

line=`cat $user |wc -l`

num=$[RANDOM%$line+1]

head -$num $user |tail -1

sleep 0.2

done

命令中可以加上sleep 0.2 ,這樣會使cpu的使用不致過高

示例:寫個指令碼,螢幕提示如下

1.檢視IP

2.檢視記憶體

3.檢視CPU資訊

4.檢視硬碟

5.退出

請輸入您的選項[1-5]: abc

#!/bin/bash

while :

do 

clear

echo -e "\033[34m    選單\033[0m"

echo "1.檢視IP

2.檢視CPU

3.檢視磁碟

4.檢視記憶體

5.退出"

read -p "請輸入選項[1-5]:" i

if [ $i -eq 1 ];then

ifconfig eth0 |grep "inet"

read -p "按回車鍵繼續..."

elif [ $i -eq 2 ];then

cat /proc/cpuinfo |grep vendor

cat /proc/cpuinfo |grep MH

cat /proc/cpuinfo |grep cache

read -p "按回車鍵繼續..."

elif [ $i -eq 3 ];then

df -h

read -p "按回車鍵繼續..."

elif [ $i -eq 4 ];then

free

read -p "按回車鍵繼續..."

elif [ $i -eq 5 ];then

exit

else

read -p "請輸入選項[1-5]:" i

fi

done

+++++++++++++++++++++++++++

case語句(簡化版if)

——檢查變數的實際取值相匹配,則執行對應的操作

case分支屬於匹配執行的方式,它針對指定的變數預先設定一個可能的取值,判斷該變數的實際取值是否與預設的某一個值相匹配,如果匹配上了,就執行相應的一組操作,如果沒有任何值能夠匹配,就執行預先設定的預設操作。

case 變數值  in

模式1)

   命令序列1 ;;

模式2)

   命令序列2 ;;

*)

   預設命令序列

esac

示例:當用戶輸入引數redhat(fefora),則返回fefora(redaht),其他則提示用法

#!/bin/bash

if [ $1 ==  "redhat" ];then       //$1為指令碼執行時的第一個引數

echo "fedora"

elif [ $1 == "fedora" ];then

echo "redhat"

else

echo "用法: $0 {redhat|fedora}"

fi

或者

#!/bin/bash

case $1 in

redhat)

echo "fedora";;

fedora)

echo "redhat";;

*)                          //預設輸出指令碼用法

echo "用法: $0 {redhat|fedora}"

esac

示例:判斷使用者輸入的是數字、字母、標點符號(擊鍵型別)

#!/bin/bash

read -p "輸入字元:" key

case $key in

[0-9])

echo 數字;;

[a-Z])

echo "字母";;

*)

echo "空格、功能鍵或其他控制字元"

esac

++++++++++++++++++++++++++++

編寫Apache啟動指令碼:

#yum -y install httpd

#vim test.sh

#!/bin/bash

case $1 in

start)

/usr/sbin/httpd

echo "我已經啟動了";;

stop)

kill `cat /var/run/httpd/httpd.pid`;;   #反引號

restart)

kill `cat /var/run/httpd/httpd.pid`

    sleep 1

/usr/sbin/httpd;;

status)

if [ -f /var/run/httpd/httpd.pid ];then

echo "httpd is 在執行..."

else

echo "沒有running"

fi;;

*)

echo "用法是$0 {start|stop|restart|status}"

esac

++++++++++++++++++++++++++++++

給Apache啟動指令碼新增開機啟動功能:

#vim test.sh

#!/bin/bash

#chkconfig: - 88 90

case $1 in

start)

/usr/sbin/httpd

echo "我已經啟動了";;

stop)

kill `cat /var/run/httpd/httpd.pid`;;   #反引號

restart)

kill `cat /var/run/httpd/httpd.pid`

    sleep 1

/usr/sbin/httpd;;

status)

if [ -f /var/run/httpd/httpd.pid ];then

echo "httpd is 在執行..."

else

echo "沒有running"

fi;;

*)

echo "用法是$0 {start|stop|restart|status}"

esac

++++++++++++++++++++++++++++++

#vim myhttp給啟動指令碼新增一行註釋

#chkconfig: - 88 90

#chkconfig --add myhttpd

#chkconfig --list myhttpd

#chkconfig myhttpd on

#chkconfig myhttpd off

++++++++++++++++++++++++++++++++

相關推薦

Shell版本迴圈語句if//for/while/case

if選擇結構 if單分支處理:當“條件成立”時執行命令序列xx,否則,不執行任何操作(只判斷為真)    if [條件測試] ; then       命令序列xx fi 示例:檢測/media/cdrom目錄,若不存在則建立     #!/bin/bash

shell指令碼---迴圈語句forwhile,until

1、for迴圈 基本格式: for 變數 in 列表 do command1 command2 … commandN done 示例1: 示例2: 示例3: 2、while迴圈—滿足條件執行 基本格式: while 條件 do command done 示例1: 示例2: 3、un

選擇 | 迴圈 | 語句ifif……else,switch,whilefor的理解和使用

一、選擇結構語句 選擇結構語句,字面上理解既然含有選擇,就一定得有相應供其選擇的條件才行。 例如現實世界中我們開車遇到紅綠燈會知道紅燈停,綠燈行,Java中也是如此,有些程式碼必須滿足條件才能被執行。 對一些條件進行判斷,從而來確定執行哪些程式碼的語句,就

awk 控制語句if for do while)

在linux awk的 while、do-while和for語句中允許使用break,continue語句來控制流程走向,也允許使用exit這樣的語句來退出。break中斷當前正在執行的迴圈並跳到迴圈外執行下一條語句。if 是流程選擇用法。 awk中,流程控制語句,語法結

條件語句詳解if,for,while,case,until,shift

if語句 單分支 if 判斷條件;then 條件為真的分支程式碼 fi 雙分支 if 判斷條件; then 條件為真的分支程式碼 else 條件為假的分支程式碼 fi 多分支 if 判斷條件1; then 條件1為真的分支程式碼 elif 判斷條件2; then

shell的基本語句for迴圈while迴圈,巢狀迴圈if 的多重迴圈case語句

1.for迴圈(遍歷) for 條件 do 動作 done 練習1:檢測當前172.25.254網段主機的狀態 [[email protected] mnt]# vim test.sh 1 #!/bin/bash 2 for ((IP=1;IP<=10

python筆記5-控制流條件語句迴圈、遍歷語句ifforwhile

1.條件語句 語法:if 條件表示式:程式碼塊      elif 條件表示式:程式碼塊      else:程式碼塊 if語句的特點,關鍵字if 滿足條件才執行下面的程式碼塊或者elif模組; 必須是以if開頭,可以沒有elif或者else,但不能沒有if

Python入門筆記—第二章分支迴圈 if,for,while

第二章:分支迴圈 1.三大結構 順序(語句一條一條執行下去,則為順序,此處略過) 分支 迴圈 注:Python中沒有switch-case語句 2.分支—if 2.1 if   age = 19 if age > 19:

c學習筆記--4 迴圈控制語句 if for while do

好久之前的了,學習c語言的筆記。 依舊是老套路,從基礎的變數型別,到函式定義一步步學起 #include <stdio.h> #include <string.h> //控制語句 這個在不同語言裡幾乎都不變 void test5() {

linux shell 語言基礎2流程控制if while for until case

一、if 條件語句 方式一: if [ 條件 ]  或      if [ 條件 ];then then                    &n

Java程式設計_迴圈語句while語句、do-while語句for語句

迴圈語句     迴圈語句在程式設計中用來描述有規則重複的流程。在實際的程式中,存在很多需要重複執行的流程,為了簡化這些重複的執行流程,在程式設計語言中新增了該類語句。     在學習迴圈語句時,最重要的就是發現流程的規律,然後再用程式設計語言將該規律描述出來,從來實

Java 筆記 之 流程控制語句 if & switch & for & while

概述 在一個程式執行的過程中,各條語句的執行順序對程式的結果是有直接影響的。也就是說程式的流程對執行結果有直接的影響。所以,我們必須清楚每條語句的執行流程。而且,很多時候我們要通過控制語句的執行順序來實現我們要完成的功能。 分類  順序結構 

Shell腳本應用if語句的結構

返回值 測試 執行 數值 表達 邏輯 下一個 否則 語句 1、測試:檢測表達式是否成立,成立則返回值為0,否則為非0方法:1)test 表達式2)【 表達式 】2、文件測試:-d:是否為目錄-f:是否為文件-e:是否存在-r:是否有讀取權限-w:是否有寫入權限-x:是否有

Python語法之選擇和迴圈ifwhile

前言:在程式開發中,一共有三種流程方式: 順序:從上向下,順序執行程式碼 分支:根據條件判斷,決定執行程式碼的分支 迴圈:讓特定程式碼重複執行(解決程式設計師重複工作) 1.判斷的定義: 如果條件滿足,才能做某件事 如果條件不滿足,就做另外一件事情,或者什麼也不做 正是有了判斷,才使得程式世界豐富多彩,充滿

以猜數字遊戲為例理解C語言while迴圈語句if條件

迴圈語句和條件語句是程式語言的基礎, 而while迴圈語句與if條件語句是條件語句和迴圈語句的基礎. 因此我們在學習C語言的開始要好好學習與認真思考著兩個語句. 本次將藉助簡單的猜數字遊戲開幫助大家理解. 首先我們會讓系統隨機獲得一個數字,然後讓玩家輸入一個數字,系統會提醒是"高了"

迴圈語句中的 do~while語句 for語句 的練習

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http:/

Python控制結構IfWhileFor

Python控制結構 Python控制結構 條件分支 if語句 迴圈 while迴圈 for 迴圈

Python While迴圈語句

好啦,咋們來了,繼續吧。 本章學習點: while else break 與 continue 上節小作業(模仿銀行輸入的密碼出錯3次,而鎖定賬戶(三次重新輸入密碼的機會)) 一. While else 組合 在我們上節已經說過了whi

for迴圈語句階乘運算

#include<stdio.h> main() { int i,j,n; long term, sum=0; printf("Input n:"); while(scanf("%d",&n)!=EOF){

shell條件巢狀if條件語句

if condition then command1 command2 ... commandN fi 當然,也可以寫成一行(適用於終端命令提示符),像這樣: if test $[2*3] -eq $[1+5]; then echo 'The two numbers are