shell腳本編程2

八、條件選擇if語句

    注:if語句可嵌套

    單分支

        if 判斷條件;then

            條件為真的分支代碼

        fi

    雙分支

        if 判斷條件;then

            條件為真的分支代碼

        else條件為假的分支代碼

        fi

    多分支

        if CONDITION1; then

            if-true

        elif CONDITION2; then

            if-ture

        elif CONDITION3; then

            if-ture

            

        else

            all-false

        fi

    逐條件進行判斷,第一次遇為“真”條件時,執行其分支,而后結束整個if語句

    if實例

    根據命令的退出狀態來執行命令

if ping -c1 -W2 station1 &> /dev/null; then

echo 'Station1 is UP'

elif grep "station1" ~/maintenance.txt &> /dev/null

then

echo 'Station1 is undergoing maintenance‘

else

echo 'Station1 is unexpectedly DOWN!'

exit 1

fi

[root@www wang]# cat jiaoben1.sh 
#!/bin/bash
read -p "Input your age please:" age
	if [ $age -eq 0 ];then
		echo "You were born!"
	elif [ $age -gt 0 -a $age -le 18 ];then
		echo "You are young!"
	elif [ $age -gt 18 -a $age -le 60 ];then
		echo "You are  middle-aged!"
	elif [ $age -gt 50 -a $age -le 120 ];then
		echo "You are older"
	else 
		echo "You are monster"
	fi
[root@www wang]# bash jiaoben1.sh 
Input your age please:0
You were born!
[root@www wang]# bash jiaoben1.sh 
Input your age please:14
You are young!
[root@www wang]# bash jiaoben1.sh 
Input your age please:34
You are  middle-aged!
[root@www wang]# bash jiaoben1.sh 
Input your age please:88
You are older
[root@www wang]# bash jiaoben1.sh 
Input your age please:180
You are monster

    條件判斷: case語句

        case 變量引用 in

        PAT1)

            分支1

            ;;

        PAT2)

            分支2

            ;;

        

        *)

            默認分支

            ;;

        esac

    case支持glob風格的通配符:

        *: 任意長度任意字符

        ?: 任意單個字符

        []:指定范圍內的任意單個字符

        a|b: a或b

[root@www wang]# cat jiaoben2.sh 
#!/bin/bash
read -p "What laowang eat?" food
if [ "$food" != "" ];then
	case $food in
	"watermelon"|"apple"|"bananas")
		echo "Buy fruit"
	;;
	"spinach"|"parsley"|"rape")
		echo "Buy vegetables"
	;;
	"rice"|"noodles"|"steamed bread")
		echo "Buy staple food"
	;;
	esac
elif [ "$food" == "" ];then
	echo "laowang don't eat!"
fi
[root@www wang]# bash jiaoben2.sh 
What laowang eat?apple     
Buy fruit
[root@www wang]# bash jiaoben2.sh 
What laowang eat?rape
Buy vegetables
[root@www wang]# bash jiaoben2.sh 
What laowang eat?rice
Buy staple food
[root@www wang]# bash jiaoben2.sh 
What laowang eat?
laowang don't eat!

九、循環

    循環執行

        將某代碼段重復運行多次

        重復運行多少次:

            循環次數事先已知

            循環次數事先未知

        有進入條件和退出條件

    for, while, until

    for循環

        for 變量名 in 列表;do

            循環體

        done

        執行機制:

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

        列表生成方式:

            直接給出列表

            整數列表:

                {start..end}

                $(seq [start [step]] end)

            返回列表的命令

                $(COMMAND)

            使用glob, 如: *.sh

            變量引用:

                $@, $*

[root@www sh.log]# cat delgroupGT1000.sh 
#!/bin/bash
#author:DYW
for w in `getent group|cut -d: -f1,3`;do
	groupname=`echo "$w"|cut -d: -f1`
	groupGID=`echo "$w"|cut -d: -f2`
	if [ $groupGID -gt 1000 ];then
		`groupdel $groupname &> /dev/null`
	fi
done
 注:刪除非系統用戶

    while循環

        while CONDITION; do

            循環體

        done

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

    因此: CONDTION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正

        進入條件: CONDITION為true;

        退出條件: CONDITION為false

[root@www wang]# cat jiaoben2.sh 
#!/bin/bash
laowang=10
while [ $laowang -lt 20 ];do
	echo $laowang
	let laowang++
done

[root@www wang]# bash jiaoben2.sh 
10
11
12
13
14
15
16
17
18
19

    until循環

        until CONDITION; do

            循環體

        done

            進入條件: CONDITION 為false

            退出條件: CONDITION 為true

[root@localhost wang]# cat jiaoben3.sh 
#!/bin/bash
laowang=10
until [ $laowang -ge 20 ];do
	echo $laowang
	let laowang++
done
[root@localhost wang]# bash jiaoben3.sh 
10
11
12
13
14
15
16
17
18
19

    循環控制語句continue

    用于循環體中

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

        while CONDTIITON1; do

        CMD1

        

            if CONDITION2; then

                continue

            fi

        CMDn

        

        done

        退出循環中的n次循環

    循環控制語句break

        用于循環體中

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

        while CONDTIITON1; do

        CMD1

        

            if CONDITION2; then

            break

            fi

        CMDn

        

        done

        退出整個循環

    創建無限循環

        while true; do

            循環體

        done

        until false; do

            循環體

        Done

十、特殊用法

    while循環的特殊用法(遍歷文件的每一行):

        while read line; do

            循環體

        done < /PATH/FROM/SOMEFILE

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

[root@localhost wang]# cat jiaoben3.sh 
#!/bin/bash

sum=0
while read i;do
	sum=$[sum+`echo $i|cut -d: -f3`]
done < /etc/passwd
echo $sum
[root@localhost wang]# bash jiaoben3.sh 
7645

    雙小括號方法,即((…))格式,也可以用于算術運算

    雙小括號方法也可以使bash Shell實現C語言風格的變量操作

        #I=10

        #((I++))=let i++

    for循環的特殊格式:

        for ((控制變量初始化;條件判斷表達式;控制變量的修正表達式))

        do

            循環體

        done

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

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

[root@localhost wang]# cat jiaoben3.sh 
#!/bin/bash
#author:DYW
for ((laowang=0;laowang<10;laowang++));do
	echo "$laowang"
done
[root@localhost wang]# bash jiaoben3.sh 
0
1
2
3
4
5
6
7
8
9

十一、select 循環與菜單

    select variable in list

    do

        循環體命令

    done

    select 循環主要用于創建菜單,按數字順序排列的菜單項將顯示在標準錯誤上,并顯示 PS3 提示符,等待用戶輸入

    用戶輸入菜單列表中的某個數字,執行相應的命令

    用戶輸入被保存在內置變量 REPLY 中。

    PS3是select的提示符

    select 與 case

        select 是個無限循環,因此要記住用 break 命令退出循環,或用 exit 命令終止腳本。也可以按 ctrl+c退出循環。

        select 經常和 case 聯合使用

        與 for 循環類似,可以省略 in list , 此時使用位置參量

[root@localhost wang]# cat jiaoben3.sh 
#!/bin/bash
#author:DYW
PS3="please choose:"
select cmd in pwd ls hostname df exit;do
	$cmd
done
[root@localhost wang]# bash jiaoben3.sh 
1) pwd
2) ls
3) hostname
4) df
5) exit
please choose:1
/wang
please choose:3
localhost.localdomain
please choose:5

十二、函數

    函數function是由若干條shell命令組成的語句塊,實現代碼重用和模塊化編程。

    它與shell程序形式上是相似的,不同的是它不是一個單獨的進程,不能獨立運行,而是shell程序的一部分。

    函數和shell程序比較相似,區別在于:

        Shell程序在子Shell中運行

        而Shell函數在當前Shell中運行。因此在當前Shell中,函數可以對shell中變量進行修改

    定義函數

        函數由兩部分組成:函數名和函數體。

        語法一:

            function f_name {

                …函數體…

            }

        語法二:

            f_name() {

                …函數體…

            }

    函數使用

        函數的定義和使用:

            可在交互式環境下定義函數

            可將函數放在腳本文件中作為它的一部分

            可放在只包含函數的單獨文件中

        調用:函數只有被調用才會執行;

            調用:給定函數名

            函數名出現的地方,會被自動替換為函數代碼

        函數的生命周期:被調用時創建,返回時終止

    函數返回值

        函數有兩種返回值:

        函數的執行結果返回值:

            使用echo或printf命令進行輸出

            函數體中調用命令的輸出結果

        函數的退出狀態碼:

            默認取決于函數中執行的最后一條命令的退出狀態碼

            自定義退出狀態碼, 其格式為:

                return 從函數中返回,用最后狀態命令決定返回值

                return 0 無錯誤返回。

                return 1-255 有錯誤返回

    交互式環境下定義和使用函數

#!/bin/bash
[root@localhost wang]# cat fun1 
fun() {
	ls
	}
[root@localhost wang]# . fun1
compression  file1  file2  fun1  jiaoben1.sh  jiaoben2.sh  jiaoben3.sh

        定義該函數后,若在$后面鍵入dir,其顯示結果同ls -l的作用相同。

            $dir

        該dir函數將一直保留到用戶從系統退出,或執行了如下所示的unset命令:

            $ unset dir

    在腳本中定義及使用函數

        函數在使用前必須定義,因此應將函數定義放在腳本開始部分,直至shell首次發現它后才能使用

        調用函數僅使用其函數名即可。

#!/bin/bash
[root@localhost wang]# cat fun1 
fun() {
	ls
	}
echo "before"
fun
echo "rear"
[root@localhost wang]# . fun1 
before
compression  file1  file2  fun1  jiaoben1.sh  jiaoben2.sh  jiaoben3.sh
rear

        執行先后順序:別名→函數→內部命令

    使用函數文件

        可以將經常使用的函數存入函數文件,然后將函數文件載入shell。

        文件名可任意選取,但最好與相關任務有某種聯系。例如: functions.main

        一旦函數文件載入shell,就可以在命令行或腳本中調用函數。可以使用set命令查看所有定義的函數,其輸出列表包括已經載入shell的所有函數。

        若要改動函數,首先用unset命令從shell中刪除函數。改動完畢后,再重新載入此文件。

    載入函數

        函數文件已創建好后,要將它載入shell

        定位函數文件并載入shell的格式:

            . filename 或 source filename

        注意:此即<點> <空格> <文件名>

            這里的文件名要帶正確路徑

    檢查載入函數

        使用set命令檢查函數是否已載入。 set命令將在shell中顯示所有的載入函數。

    執行shell函數

        要執行函數,簡單地鍵入函數名即可:

    刪除shell函數

        現在對函數做一些改動。首先刪除函數,使其對shell不可用。使用unset命令完成此功能.

            命令格式為:

                unset function_name

    再鍵入set命令,函數將不再顯示

    函數參數

        函數可以接受參數:

            傳遞參數給函數:調用函數時,在函數名后面以空白分隔給定參數列表即可;例如“ testfunc arg1 arg2 …”

            在函數體中當中,可使用$1, $2, …調用這些參數;還可以使用$@, $*, $#等特殊變量

    函數變量

        變量作用域:

            環境變量:當前shell和子shell有效

            本地變量:只在當前shell進程有效,為執行腳本會啟動專用子shell進程;因此,本地變量的作用范圍是當前shell腳本程序文件,包括腳本中的函數。

            局部變量:函數的生命周期;函數結束時變量被自動銷毀

        注意:如果函數中有局部變量,如果其名稱同本地變量, 使用局部變量。

        在函數中定義局部變量的方法

            local NAME=VALUE

    函數遞歸:

        函數直接或間接調用自身

        注意遞歸層數

    遞歸實例:

    階乘是基斯頓·卡曼于 1808 年發明的運算符號,是數學術語一個正整數的階乘( factorial)是所有小于及等于該數的正整數的積,并且有0的階乘為1。自然數n的階乘寫作n!。

        n!=1×2×3×…×n。

        階乘亦可以遞歸方式定義: 0!=1, n!=(n-1)!×n。

        n!=n(n-1)(n-2)…1

        n(n-1)! = n(n-1)(n-2)!

[root@localhost wang]# cat fun1 
#!/bin/bash

fact() 
	{
		if [ $1 -eq 0 -o $1 -eq 1 ]; then
			echo 1
		else
			echo $[$1*$(fact $[$1-1])]
		fi
	}

[root@localhost wang]# . fun1
[root@localhost wang]# fact 1
1
[root@localhost wang]# fact 4
24
[root@localhost wang]# fact 6
720

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

(0)
DYWDYW
上一篇 2016-08-22 13:37
下一篇 2016-08-22 20:17

相關推薦

  • 進程與計劃任務

    進程 一.進程介紹  內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、 安全功能等。   Process:  運行中的程序的一個 副本,是被 載入內存的一個指令集合。 進程ID (Process ID ,PID )號碼被用來標記各個進程 UID 、GID&…

    Linux干貨 2017-05-15
  • CentOS進程管理

    CentOS進程管理 筆記 Linux系統中的基本運行單位是進程,通過對系統系統中的進程的管理能夠對系統的實時運行狀態進行了解和調度。Linux中提供了用于查看、調整和停止進程的命令。本文仍然以RHEL6說明Linux系統的進程管理。 CentOS進程管理 一、進程概述 二、查看進程 1、使用ps命令 2、top命令 一、進程概述 程序是保存在存儲介質中的可…

    Linux干貨 2017-05-15
  • iptables基礎詳解

    一.iptables基礎認知二.iptables使用格式  一.iptables簡介   1.Iptabels是與Linux內核集成的包過濾防火墻系統,幾乎所有的linux發行版本都會包含Iptables的功能。如果 Linux 系統連接到因特網或LAN、服務器或連接 LAN 和因特網的代理服務器, 則Iptables有利于在 …

    2017-05-03
  • linux基礎學習-第六天

    2016-08-02 授課內容: 用戶和組管理命令 理解并設置文件權限 默認權限 特殊權限 文件ACL 用戶和組管理命令 用戶和組的配置文件:/etc/default/useradd(相當于useradd -D)、/etc/skel(創建用戶的家目錄配置文件)、/etc/login.defs(修改用戶的密碼策略配置) /etc/default/useradd…

    Linux干貨 2016-08-04
  • VPS服務器的購買使用

    ? ? ? ?Virtual Host Server(虛擬主機)是一個云計算服務,相比于傳統的購買服務器硬件方式搭建服務器,有著價格便宜,個性化定制配置,使用靈活等特點。按需求購買計算資源,只需要幾分鐘時間就可以在公網配置一個屬于自己的服務器。 ? ? ? ? 最著名的云計算服務提供商國外有Amazon,Google,vultr等等,國內有阿里云,騰訊云等等…

    2018-03-26
  • vim實用技能

    vim編輯器 簡介 vi: Visual Interface,文本編輯器 文本:ASCII, Unicode 文本編輯種類: 行編輯器: sed 全屏編輯器:nano, vi VIM – Vi IMproved 使用 vim:模式化的編輯 基本模式: 編輯模式,命令模式 輸入模式 末行模式: 內置的命令行接口 打開文件: # vim [OPTIO…

    Linux干貨 2018-01-16
欧美性久久久久