Bash編程之流程控制

Bash作為一種過程式編程語言,擁有一套流程控制體系,可完成選擇執行,循環執行功能。下面分別介紹if/else,case,select,for,while/until等語法的使用。

Bash作為一種過程式編程語言,擁有一套流程控制體系,可完成選擇執行,循環執行功能。下面分別介紹if/else,case,select,for,while/until等語法的使用。

一、選擇執行

1、if語句

根據條件判斷來選擇執行哪個分支;if語句分為三種形式

1) 單分支

2) 雙分支

3) 多分支

(1) 單分支

語法:

if condition;then          #命令不能和then寫在一行
    command...
fi                          #if語句結束標志

condition 可以是條件測試:test,[ ],[[ ]];也可是一條命令。根據狀態碼來判斷,0為true,其他為false。為true則執行then后面的語句,為false則不執行。

(2)雙分支

語法:

if   condition;then
    command...
else
    command...
fi

判斷condition的真假,為true執行then后面語句,為false則執行else后面語句

Bash的if分支語句不能為空,所以else后面的語句為空的話,else必需省略,則變為單分支形式。

例子,創建一個腳本,實現如下功能:使用一個用戶名做為參數,如果指定參數的用戶存在,就顯示其存在,否則添加之;顯示添加的用戶的id號等信息。

#!/bin/bash

[ -z $1 ]&&echo no user name&&exit       #判斷傳入參數是否合法
if id $1 &>/dev/null;then                #使用id 命令判斷用戶是否存在
        echo $1 already exist
        exit
else
        useradd $1
        echo user $1 create complete
        echo `id -a $1`
fi

(3)多分支

語法:

if condition1;then
    command...          #分支1
elif condition2;then
    command...          #分支2
elif condition3;then
    command...          #分支3

...                     #分支N

else
    command...          #其他情況,可省略
fi

執行邏輯:條件依次判斷,當遇到條件為真時,執行其分支,然后退出if;如果所有條件都為假時,執行else分支,退出if。

例子,編寫一個腳本,判斷用戶輸入文件路徑,顯示其文件類型(普通,目錄,鏈接,其它文件類型)

#!/bin/bash

[ ! -e $1 ]&&echo no such file &&exit

if [ -d "$1" ];then
        echo "`basename $1` is a directory"
elif [ -L "$1" ];then
        echo "`basename $1` is a symblic link"
elif [ -f "$1" ];then
        echo "`basename $1` is a regular file"
else
        echo "`basename $1` is an other type file"
fi

2、case語句

語法:

case  ${var}  in
part1)
    command...
    ;;                #分支結束符
part2)
    command...
    ;;
part3)
    command...
    ;;
*)
    command...
    ;;
esac                #case語句結束符

case語句在字符串判斷上,可以替代if復雜的語句結構。

part判斷,支持glob風格通配符:

? 代表一個任意字符

* 代表任意長度字符

[] 指定范圍內一個字符

| 或操作符

例子,編寫一個腳本,提示用戶輸入yes或no,并判斷用戶輸入的是yes還是no,或是其它信息。

#!/bin/bash

read -p "please choose yes or no ? " input

case $input in
y|Y|[yY][eE][sS])            #可以支持判斷模糊輸入
        echo you answer yes
        ;;
n|no|[nN][oO])
        echo you answer no
        ;;
*)
        echo you answer other
        ;;
esac

二、循環執行

1、for語句

for語句適合執行列表遍歷形式的循環。

語法:

for var in List;do

    command...
    
done

執行機制:依次將列表中的元素賦值給“變量名”; 每次賦值后即執行一次循環體; 直到列表中的元素耗盡,循環結束。

List給出形式:

(1)直接給出

for var in root mysql ftp;do    #分隔符為空格
...

(2) 整數列表:

        (a) {start..end}
        (b) $(seq [start [step]] end)

(3) 返回列表的命令

        $(COMMAND)

(4) 使用glob,如:*.sh

(5) 變量引用;

        $@, $*

#!/bin/bash         #ping IP 192.168.0.0 到 192.168.255.255 主機在線情況

for ip in 192.168.{0..255}.{0..255}
do
	if ping -W1 -c1 $ip &>/dev/null;then
		echo $ip is reachable
	else
		echo $ip is unreachable
	fi
done

for循環的特殊格式:

和c語言中for循環相同的格式,適合計數形式的循環。

語法:

for ((控制變量初始化;條件判斷表達式;控制變量的修正表達式));do          #括號中兩個分號
    command...
done

 控制變量初始化:僅在運行到循環代碼段時執行一次

 控制變量的修正表達式:每輪循環結束會先進行控制變量修正運算,而后再做條件判斷

#!/bin/bash                # 使用for循環實現1...100加和
for ((i=1;i<=100;i++));do
    let sum+=i
done
echo $sum

2、while語句

語法:

while condition; do
    
    command...
    
done

condition:循環控制條件,進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;條件為“true”,則執行一次循環;直到條件測試狀態為“false”終止循環

#!/bin/bash                #使用while循環實現1到100加和
n=1                        
while [ $n -le 100 ]; do      
	((sum+=n))
	((n++))            #條件控制變量修正
done
echo $sum

while循環的特殊用法

用于實現遍歷文件的每一行,根據取到的值進行其他操作。這是for語句做不到的。

語法:

while read line; do
    command...
done < /PATH/FROM/SOMEFILE

依次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將行賦值給變量line。

#!/bin/bash                #遍歷passwd文件,給用戶添加備注信息

while read line;do
	user=`echo $line|cut -d: -f1`        #獲取每一行中的用戶名
	gecos=`echo $line|cut -d: -f5`
	if [ -z "$gecos" ];then
		chfn -f $user -p '62985600' $user &>/dev/null \      #給獲取到的用戶添加備注
		&&echo "GECOS of $user has changed"\
		||echo "GECOS of $user failed to change"
	fi
done < /etc/passwd

3、until語句

until語句與while語句形式相同,但是進入循環和退出循環的條件恰恰相反。

語法:

until condition; do
    
    command...
    
done

condition:循環控制條件,進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;條件為“false”,則執行一次循環;直到條件測試狀態為“true”終止循環。

#!/bin/bash                #使用until實現1到100加和
n=1
until [ $n -gt 100 ]; do    #條件判斷為直到n>100停止循環
	((sum+=n))
	((n++))
done
echo $sum

4、循環控制語句

控制語句用來提前結束一次循環,或者直接退出循環。

(1)continue

continue [N]:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層

#!/bin/bash
i=1
while [ $i -le 3 ];do
    echo ------------
    let i++
    continue
    echo ************
done

#執行結果,echo ** 在continue后面,永遠不會被執行
------------
------------
------------

(2)break

break [N]:提前結束第N層循環,最內層為第1層

#!/bin/bash
i=1
while [ $i -le 3 ];do
    echo ------------
    let i++
    break
    echo ************
done

#執行結果,當打印第一次----后,遇到break標志,直接退出循環
------------

5、select語句

語法:

select var  [in List];do        #in List 可省略,使用位置變量傳參
    command...
done

select語句主要用于創建菜單,按數字排列的菜單項將顯示在標準輸出上,并顯示PS3提示符,等待輸入,并且用戶輸入的內容由內置變量REPLY記錄。

select循環是個死循環,循環體中加入break命令退出循環,經常配合case使用。

例子,

#!/bin/bash                          #腳本如下

PS3='which one would you like?'      #定義PS3提示符
select fruit in apple banana orange;do
case $fruit in
apple)
        echo "$fruit values 2\$/kg"
        break
        ;;
banana)
        echo "$fruit values 1\$/kg"
        break
        ;;
orange)
        echo "$fruit values 0.5\$/kg"
        break
        ;;
esac
done

[fly@centos7 shell]$ ./select.sh    #執行展示
1) apple
2) banana
3) orange
which one would you like?2
banana values 1$/kg
[fly@centos7 shell]$

原創文章,作者:cutemsyu,如若轉載,請注明出處:http://www.www58058.com/37945

(0)
cutemsyucutemsyu
上一篇 2016-08-21
下一篇 2016-08-21

相關推薦

  • linux中的幾種壓縮工具

    文件壓縮 compress 不能自動補齊 .Z -d 解壓縮 uncompress zcat X.Z > X -c 將結果打印到屏幕上,配合重定向,不會覆蓋原文件,但權限會變。 -f 默認不對硬鏈接數為2及以上的文件壓縮,加上f,強制壓縮指定文件,而其他同inode的文件硬鏈接數減1. -v 顯示詳細過程。 ———&…

    2017-08-11
  • 計算機的組成、Linux主流三大版本的區別、Linux的哲學思想、Linux的使用格式及命令的使用簡略說明,以及如何查看命令幫助、FHS目錄機構

    計算機的組成極其功能? 按功能來說計算機是由運算器、控制器、I/O系統(輸入、輸出系統)、存儲器五部分組成。 運算器:即中央處理器(CPU)作為五大部分中心的主腦,對數據進行邏輯運算或算數運算。 控制器:主要是指內存設備,將讀取到的數據臨時保存在內存中這個過程被成為尋址。在cpu中也有屬于自己的控制器稱之為CPU的寄存器來進行多指令的行。 I/O系統:輸入系…

    2017-12-03
  • rpm包管理與yum簡要用法

    linux程序包管理 程序包:源代碼 –> 目標二進制格式(二進制程序、庫文件、配置文件、幫助文件)–> 組織成一個或有限的幾個包文件 程序包管理器:        debian –> dpkg   以“.deb”結尾 &nb…

    Linux干貨 2016-08-22
  • SSH——安全的通信

    SSH ·ssh:secure shell, protocol, 22/tcp,  安全的遠程登錄 ·OpenSSH:ssh協議的開源實現 ·dropbear:另一個開源實現 ·SSH協議版本:          v1:基于CRC-32做MAC,不安全;man-in-m…

    Linux干貨 2016-09-25
  • CentOS6.7 Xen安裝部署和基本測試小結

    目錄:    1. Xen的簡介    1.1  Xen的大體結構    1.2 Xen對VM的稱呼    1.3 Xen對CPU和內存的虛擬化過程    1.4 Xen對IO設備的虛擬化過程    1.5 Linux Kerne…

    Linux干貨 2016-04-19
  • 數組、變量及bash的配置

    數組、變量及bash的配置 變量:存儲單個元素的內存空間 數組:存儲多個元素的內存空間,相當于多個變量集合 索引:編號從0開始,屬于數值索引,索引為自定義格式即為關聯數組(bash4.0之后支持) bash數組支持稀疏格式 數組的聲明 普通數組declare –a 關聯數組 declare –A 普通數組可以不聲明直接使用,關聯數組必須先聲明再使用 數組的賦…

    Linux干貨 2016-08-26

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-21 22:24

    文章對各循環語句語法進行了梳理,通過腳本加深了自己對各語句的認識。關于課后練習需要認真完成,老師選的課后練習,都是筆試中常見的,也是很經典的。

欧美性久久久久