Shell編程


Shell編程基礎入門

 

 

1.shell格式:例

  shell腳本開發習慣

      1.指定解釋器 #!/bin/bash

      2.腳本開頭加版權等信息如:#DATE:時間,#author(作者)#mail:郵箱,#function(功能),#Version:版本

      3.腳本注釋(用英文注釋 中文可能亂碼。)

      4.腳本以.sh結尾 不是必須的

      5.成對的符號,一次性寫全,退格補內容。特殊符號[ xxxx ] 中括號中間內容兩邊都有空格。

      6 .代碼有條理性(通過縮進)。

 

2.執行1.sh xxx.sh (-x)執行並顯示執行過程。

        sh xx.sh(不需要root權限)。全路徑執行需要x權限。(chmod a+x xx.sh)當前路徑下用點執行(. xx.sh )或者source  xxx.sh (重點)

注意:兩個 腳本 ,當一個腳本需要調用前一個腳本里面的內容時候 。需要source  或者點 “.” 來執行加載才可調用。Sh .xxsh  bash  xxx 只可執行 不可加載。  

    

學習在線資料:http://manual.51yip.com/shell/

3.環境變量全局配置地點:常見的:/etc/profile , /etc/basrc , /etc/profile.d/xxx.sh ,

      用戶的環境變量~/.bash_profile  ~./bash_bashrc

      設置環境變量用export 變量名(大寫)=xxx變量值。

      如登錄時候提示信息可在 vi /etc/motd 編輯改文件自定義提示信息。也可在/profile.d/xx.sh 內如可寫echo “xxx自定義提示信息”。即可加入x執行權限。注意:定時任務。環境變量需要重新定義。

     (1). 顯示環境變量輸出: echo $XXX , set ,env 顯示比較全面。

     (2)取消變量 unset 命令行臨時取消。

     (3)jobs 將查當前后台執行程序。

     (4) ctrl+z 暫停, fg 調至前台運行,bg將程序調至后台執行。

     (5)清空日志:cat /dev/null >test.log   unll

4.shell特殊符號總結

‘’單引號 照原輸出。

“” 自動識別變量執行,遇到命令需要加反引號。=不加引號(設置變量里面)

.*表示任意字符

.  表示任意一個字符。

*  表示任意0個或多個字符。(包括+和?)

+ 表示1個或多個+前面的字符

表示0個或1個字符。

#  注釋符號。#后面的內容可以忽略

\ 脫意字符。

| 管道符號 將符號前面執行的結果作為符號后面的命令。如cat test.txt |wc -l 計算文檔行數。

$變量前面表示符號。還有一個妙用即和!結合起來使用。!$ 表示上一條命令中最后一個變量 如:上一次touch 1.txt 。Vi !$ 其中!$表示為1.txt、

~表示root家目錄。

& 如果把一條命令放到后台執行的話,則需要加上這個符號, 通常用作一個命令運作時間非常長的情況。如。Sleep  200 & 后台執行。Jobs 查看 bg 調用到前天 fg調用到后台。

 >>追加重定向。   >(重定向)   2>>錯誤追加重定向。2>重定向。

<  如:wc -l <1.txt

[  ]  中括號 中間字符組合,代表中間字符中的任意一個。Ls [1-3].txt

{ } 表示序列 序列 如:touch wyl{1..3}.txt 也有表示變量的意義如:  Echo “${a}abc” 告訴它a是變量。

^以什么開頭。

$以什么結尾。

^$表示空行。

&&  左邊命令執行成功后,在執行下一個命令

||  左邊的命令沒有執行成功后,才會執行后面的命令。

;常常把兩條命令寫在一行中間用;隔開。有或的意思。如:command1:command2

5.cut(切割)命令 檢索字段。(單獨使用檢索列配合起來可檢索字段。)

        -d 指定分隔符。用雙引號引起來。

        -f 指定第幾段。

        -c 第幾個字符。可用區間如 1-3,或者1,3,5,不可與d f 連用。

        命令實例:head -1  /etc/shadow |cut -d “:” -f 2| 查出root密碼文件

6.sort 排序。(默認ASC2碼值進行排序。)

參考文檔:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html

     -t 指定分隔符

     -n 充數字排序

     -r反向排序。

     -u 去重復。

     -k 對第幾個字符串進行排序。K3,5 表示從3-5區間字符進行排序。

      -n-u 一起用會將文檔中的字母當成0進行排序。

      注釋:Echo  -e “computer\nmouse\nadmin\nexprot”>wyl.txt -e 啟用轉義,將\n轉換為換行。http://www.linuxidc.com/Linux/2015-05/116936.htm

  規則:默認方式下

      1.以數字開頭的優先級最高

      2.以小寫字母開頭的優先級次之

      3.待排序內如按字典序進行排序。

      4.默認情況下sort將待 排序內容的每行關鍵字當做一個字符串進行字典排序。

12.wc  

       -l (統計行數)

       -w   (多少個單詞,以空格為分隔符。)

       -m   (多少個字符,包括空格,和換行符。)

 

 

7.uniq 去重復。

    默認和sort -u 一樣.

    -c  統計重復的行。但只能統計相鄰的行。於是常與sort連用。即:sort  1.txt|uniq -c

8.tee  類似於重定向“>” 區別在於寫入文檔后並且顯示在屏幕上 如:echo “111111w3s” | tee 1.txt

9.tr 替換字符  -d 替換字符,-s 去掉重復的字符,最常用與替換如:head -2 /etc/passwd |tr ’[a-z]’’[A-Z]’  針對字符對於字符串就不管用了,了解tr即可。

10.split 文件分割。(文件分割,常用語日志等文件過大,查看麻煩)

            

      -l 按照行數分割。

      -b 按照大小分割。默認b 如果按照K M G 可寫為:split -b 500m passwd

11.grep

12.sed

13.awk 見附頁【grep,sed awk總結】

14.date 查看時間(常用於日志中)

   更改時間:ate -s “2014-12-20 13:26:50”

   自動時間同步:yum install -y ntp

     ntpdate time.windows.com

     ntpdate ntp.fudan.edu.cn

     Date +%F (打印年月日)

     Date +%T (打印時間)

     Date +%Y-%m-%d Y:全寫年,小寫y簡寫 m月d日

     Date +%H:%M:%S H時 M分 S秒 小s:時間戳

     Date +“%Y-%m-%d %H:%M:%S”

         Date -d “-2 days”+%F  兩天前

         Date -d “-2 month”+%F 兩個月前

         Date -d “-2 hour”+%T 兩小時前

         Date -d “-2 min”+%T 兩分鍾前

         Date -d “-2 sec”+%T 兩秒前

         Date +%w  星期幾

         Date +%W  今年的第幾周

15.shell變量

 定義變量variableName(變量名)=“value(變量值)”

 注釋:變量名和等號之間不能有空格,變量名的命名須遵循如下規則:

       1.首個字符必須為字母(a-z,A-Z)

         2.中間不能有空格,可以使用下划線(_)

         3. 不能使用標點符號

         4. 不能使用bash里的關鍵字(可用help命令查看保留關鍵字)

         定義變量例:a=100  b=”http://www.cnblogs.com/wylhome

         使用變量:

          使用一個定義過的變量只要在變量名前面加美元符號($)即可,如

        your_name=wyl

        echo $your_name

        echo ${your_name}

        注釋:變量名外面的花括號是可選的,加不加都行,加花括號是為了幫助解釋器識別變量的邊界,比如下面這種情況:

              for skill in Ada Coffe Action Java

            do

            echo "I am good at ${skill}Script"

            Done

            如果不給skill變量加花括號,寫成echo "I am good at $skillScript",解釋器就會把$skillScript當成一個變量(其值為空),代碼執行結果就不是我們期望的樣子了。(推薦使用花括號)

           只讀變量:使用 readonly 命令可以將變量定義為只讀變量,只讀變量的值不能被改變。 如:your_name=wyl

              readonly your_name

              如果嘗試給your_name重新賦值,將會報錯。

            刪除變量: unset 如:unset your_name

Shell特殊變量:        

       

特殊變量列表

變量

含義

$0

當前腳本的文件名

$n

傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。

$#

傳遞給腳本或函數的參數個數。

$*

傳遞給腳本或函數的所有參數。

$@

傳遞給腳本或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同,下面將會講到。

$?

上個命令的退出狀態,或函數的返回值。

$$

當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。

舉例:vim 1.sh

echo "File Name: $0"

echo "First Parameter : $1"

echo "First Parameter : $2"

echo "Quoted Values: $@"

echo "Quoted Values: $*"

echo "Total Number of Parameters : $#"

運行:sh 1.sh wang yun long

[root@www share]# bash 1.sh wang yun long

File Name: 1.sh

First Parameter : wang

First Parameter : yun

Quoted Values: wang yun long

Quoted Values: wang yun long

Total Number of Parameters : 3

$*和$a的區別

$* 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出所有參數。但是當它們被雙引號(" ")包含時,"$*" 會將所有的參數作為一個整體,以"$1 $2 … $n"的形式輸出所有參數;"$@" 不變,依然以“$1”“$2”..形式輸出。

舉例:vim 1.sh

echo "print each param from \$*"

for var in $*

do

    echo "$var"

done

echo "print each param from \$@"

for var in $@

do

    echo "$var"

done

echo "print each param from \"\$*\""

for var in "$*"

do

    echo "$var"

done

echo "print each param from \"\$@\""

for var in "$@"

do

    echo "$var"

done

執行看到結果:

[root@www share]# bash 1.sh wang yun long

print each param from $*

wang

yun

long

print each param from $@

wang

yun

long

print each param from "$*"

wang yun long

print each param from "$@"

wang

yun

long

對出狀態:$?

表示上一個命令退出的狀態。返回結果。如測試xx安裝執行是否ok則用echo $? 結果“0”表示ok “1”表示錯誤。

Shell替換[shell變量替換,命令替換,轉義字符]

shell變量替換

  如果表達式中包含特殊字符,Shell 將會進行替換。例如,在雙引號中使用變量就是一種替換,轉義字符也是一種替換。           

#!/bin/bash

a=10

echo -e "Value of a is $a \n"

運行結果:

Value of a is 10

這里 -e 表示對轉義字符進行替換。如果不使用 -e 選項,將會原樣輸出:

Value of a is 10\n


下面的轉義字符都可以用在 echo 中:

轉義字符

含義

\\

反斜杠

\a

警報,響鈴

\b

退格(刪除鍵)

\f

換頁(FF),將當前位置移到下頁開頭

\n

換行

\r

回車

\t

水平制表符(tab鍵) 

\v

垂直制表符

可以使用 echo 命令的 -E 選項禁止轉義,默認也是不轉義的;使用 -n 選項可以禁止插入換行符。

命令替換:`命令語句` Shell可以先執行命令反引號里面的命令語句然后將輸出結果暫時保存,在適當的地方輸出

#!/bin/bash

DATE=`date`

echo "Date is $DATE"

執行后結果:

Date is 2016年 11月 06日 星期日 03:33:19 CST

變量替換可以根據變量的狀態(是否為空、是否定義等)來改變它的值
變量替換

可以使用的變量替換形式:

形式

說明

${var}

變量本來的值

${var:-word}

如果變量 var 為空或已被刪除(unset),那么返回 word,但不改變 var 的值。

${var:=word}

如果變量 var 為空或已被刪除(unset),那么返回 word,並將 var 的值設置為 word。

${var:?message}

如果變量 var 為空或已被刪除(unset),那么將消息 message 送到標准錯誤輸出,可以用來檢測變量 var 是否可以被正常賦值。
若此替換出現在Shell腳本中,那么腳本將停止運行。

${var:+word}

如果變量 var 被定義,那么返回 word,但不改變 var 的值。


請看下面的例子:

#!/bin/bash

echo ${var:-"Variable is not set"}

echo "1 - Value of var is ${var}"

echo ${var:="Variable is not set"}

echo "2 - Value of var is ${var}"

unset var

echo ${var:+"This is default value"}

echo "3 - Value of var is $var"

var="Prefix"

echo ${var:+"This is default value"}

echo "4 - Value of var is $var"

echo ${var:?"Print this message"}

echo "5 - Value of var is ${var}"

運行結果:

 Variable is not set

1 - Value of var is

Variable is not set

2 - Value of var is Variable is not set

 

3 - Value of var is

This is default value

4 - Value of var is Prefix

Prefix

5 - Value of var is Prefix

 Shell算數運算符

expr 是一款表達式計算工具,使用它能完成表達式的求值操作 

如: a=`expr 2 + 2`

echo $a 結果為4 2與+之間是有去空格的。

a=10 b=20

c=`expr $a + $b` echo $c 則顯示30 c=$[$a+$b+$c]

算術運算符列表

運算符

說明

舉例

+

加法

`expr $a + $b` 結果為 30。

-

減法

`expr $a - $b` 結果為 10。

*

乘法

`expr $a \* $b` 結果為  200。

/

除法

`expr $b / $a` 結果為 2。

%

取余

`expr $b % $a` 結果為 0。

=

賦值

a=$b 將把變量 b 的值賦給 a。

==

相等。用於比較兩個數字,相同則返回 true。

[ $a == $b ] 返回 false。

!=

不相等。用於比較兩個數字,不相同則返回 true。

[ $a != $b ] 返回 true。

乘號(*)前邊必須加反斜杠(\)才能實現乘法運算

 

 

                  

                    

 

Shell關系運算符     

關系運算符只支持數字,不支持字符串,除非字符串的值是數字。

#!/bin/sh

a=10

b=20

if [ $a -eq $b ]

then

   echo "$a -eq $b : a is equal to b"

else

   echo "$a -eq $b: a is not equal to b"

fi

運行結果: -eq 20: a is not equal to b

 

關系運算符列表

運算符

說明

舉例

-eq

檢測兩個數是否相等,相等返回 true。

[ $a -eq $b ] 返回 true。

-ne

檢測兩個數是否相等,不相等返回 true。

[ $a -ne $b ] 返回 true。

-gt

檢測左邊的數是否大於右邊的,如果是,則返回 true。

[ $a -gt $b ] 返回 false。

-lt

檢測左邊的數是否小於右邊的,如果是,則返回 true。

[ $a -lt $b ] 返回 true。

-ge

檢測左邊的數是否大等於右邊的,如果是,則返回 true。

[ $a -ge $b ] 返回 false。

-le

檢測左邊的數是否小於等於右邊的,如果是,則返回 true。

[ $a -le $b ] 返回 true。

 

 

 

布爾運算符

布爾運算符列表

運算符

說明

舉例

!

非運算,表達式為 true 則返回 false,否則返回 true。

[ ! false ] 返回 true。

-o

或運算,有一個表達式為 true 則返回 true。

[ $a -lt 20 -o $b -gt 100 ] 返回 true。

-a

與運算,兩個表達式都為 true 才返回 true。

[ $a -lt 20 -a $b -gt 100 ] 返回 false。

#!/bin/sh

 

a=10

b=20

 

if [ $a != $b ]

then

   echo "$a != $b : a is not equal to b"

else

   echo "$a != $b: a is equal to b"

fi

結果:!= 20 : a is not equal to b

字符串運算符

 

 

字符串運算符列表

運算符

說明

舉例

=

檢測兩個字符串是否相等,相等返回 true。

[ $a = $b ] 返回 false。

!=

檢測兩個字符串是否相等,不相等返回 true。

[ $a != $b ] 返回 true。

-z

檢測字符串長度是否為0,為0返回 true。

[ -z $a ] 返回 false。

-n

檢測字符串長度是否為0,不為0返回 true。

[ -z $a ] 返回 true。

str

檢測字符串是否為空,不為空返回 true。

[ $a ] 返回 true。

 

#!/bin/sh

 

a="abc"

b="efg"

 

if [ -z $a ]

then

   echo "-z $a : string length is zero"

else

   echo "-z $a : string length is not zero"

fi

結果:-z abc : string length is not zero

文件測試運算符

變量 file 表示文件“/var/www/tutorialspoint/unix/test.sh”,它的大小為100字節,具有 rwx 權限。下面的代碼,將檢測該文件的各種屬性:

文件測試運算符列表

操作符

說明

舉例

-b file

檢測文件是否是塊設備文件,如果是,則返回 true。

[ -b $file ] 返回 false。

-c file

檢測文件是否是字符設備文件,如果是,則返回 true。

[ -b $file ] 返回 false。

-d file

檢測文件是否是目錄,如果是,則返回 true。

[ -d $file ] 返回 false。

-f file

檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。

[ -f $file ] 返回 true。

-g file

檢測文件是否設置了 SGID 位,如果是,則返回 true。

[ -g $file ] 返回 false。

-k file

檢測文件是否設置了粘着位(Sticky Bit),如果是,則返回 true。

[ -k $file ] 返回 false。

-p file

檢測文件是否是具名管道,如果是,則返回 true。

[ -p $file ] 返回 false。

-u file

檢測文件是否設置了 SUID 位,如果是,則返回 true。

[ -u $file ] 返回 false。

-r file

檢測文件是否可讀,如果是,則返回 true。

[ -r $file ] 返回 true。

-w file

檢測文件是否可寫,如果是,則返回 true。

[ -w $file ] 返回 true。

-x file

檢測文件是否可執行,如果是,則返回 true。

[ -x $file ] 返回 true。

-s file

檢測文件是否為空(文件大小是否大於0),不為空返回 true。

[ -s $file ] 返回 true。

-e file

檢測文件(包括目錄)是否存在,如果是,則返回 true。

[ -e $file ] 返回 true。

#!/bin/sh

 

file="/var/www/tutorialspoint/unix/test.sh"

 

if [ -r $file ]

then

   echo "File has read access"

else

   echo "File does not have read access"

fi

結果:File has read access

Shell注釋:

在想要注釋的行前加#

shell如果在開發過程中,遇到大段的代碼需要臨時注釋起來,過一會兒又取消注釋,怎么辦呢?每一行加個#符號太費力了,可以把這一段要注釋的代碼用一對花括號括起來,定義成一個函數,沒有地方調用這個函數,這塊代碼就不會執行,達到了和注釋一樣的效果。

Shell字符串

單引號:單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的

雙引號: 可以有變量,可以出現轉義字符。

str='this is a string'

str="Hello, I know your are \"$your_name\"! \n"

拼接字符串

your_name="qinjx"

greeting="hello, "$your_name" !"

獲取字符串的長度

string="abcd"

echo ${#string} #輸出 4

 

 

提取子字符串

string="alibaba is a great company"

echo ${string:1:4} #輸出liba

查找子字符串

string="alibaba is a great company"

echo `expr index "$string" is`

查找字符串is第一次出現的下標 結果為3 下標從0 開始。

數組

Shell中,用括號來表示數組,數組元素用“空格”符號分割開。定義數組的一般形式為:

array_name=(value0 value1 value2 value3)

或者

array_name=(

value0

value1

value2

value3

)

單獨定義數組:

例如:

array_name[0]=value0

array_name[1]=value1

array_name[2]=value2

可以不使用連續的下標,而且下標的范圍沒有限制。

讀取數組格式:

${array_name[index]}

例如:Name[0]=”wang”

      Name[2]=”yun”

      Name[3]=”long”

echo “First Index: ${Name[1]}”

獲取數組里面所有元素用@或者*

獲取數組的長度

獲取數組的元素個數

Length=${#arrar_name[@]}

獲取單個元素的長度

Lengthn=${$arrar_name[n]}

 

shell printf命令:格式化輸出語句

printf函數稱為格式輸出函數,其關鍵字最末一個字母f即為“格式”(format)之意。其功能是按用戶指定的格式,把指定的數據顯示到顯示器屏幕上。在前面的例題中我們已多次使用過這個函數。

printf 命令的語法

 printf(“格式控制字符串”, 輸出表列)

中格式控制字符串用於指定輸出格式。格式控制串可由格式字符串和非格式字符串兩種組成。格式字符串是以%開頭的字符串,在%后面跟有各種格式字符,以說明輸出數據的類型、形式、長度、小數位數等。如:

其中格式控制字符串用於指定輸出格式。格式控制串可由格式字符串和非格式字符串兩種組成。格式字符串是以%開頭的字符串,在%后面跟有各種格式字符,以說明輸出數據的類型、形式、長度、小數位數等。如:

“%d”表示按十進制整型輸出;

“%ld”表示按十進制長整型輸出;

“%c”表示按字符型輸出等。

 

非格式字符串原樣輸出,在顯示中起提示作用。輸出表列中給出了各個輸出項,要求格式字符串和各輸出項在數量和類型上應該一一對應。

【例4-3】printf函數舉例

格式化復制

#include <stdio.h>

int main(void){

    int a=88,b=89;

    printf("%d %d\n",a,b);

    printf("%d,%d\n",a,b);

    printf("%c,%c\n",a,b);

    printf("a=%d,b=%d",a,b);

    return 0;

}

本例中四次輸出了a、b的值,但由於格式控制串不同,輸出的結果也不相同。第3行的輸出語句格式控制串中,兩格式串%d 之間加了一個空格(非格式字符),所以輸出的a、b值之間有一個空格。第4行的printf語句格式控制串中加入的是非格式字符逗號,因此輸出的a、b值之間加了一個逗號。第5行的格式串要求按字符型輸出a、b值。第6行中為了提示輸出結果又增加了非格式字符串。

這里僅說明與C語言printf()函數的不同:

printf 命令不用加括號

format-string 可以沒有引號,但最好加上,單引號雙引號均可。

參數多於格式控制符(%)時,format-string 可以重用,可以將所有參數都轉換。

arguments 使用空格分隔,不用逗號。

                       

     Shell if else語句                       

f 語句通過關系運算符判斷表達式的真假來決定執行哪個分支。Shell 有三種 if ... else 語句:

if [ expression ].. then.xxxx ....fi 語句;

if [ expression ]..then xxx else xxxx.. fi 語句;

if [ expression ] then xxx  elif then xxxx... else xxx... fi 語句。

解釋:(1if [ expression ].. then.xxxx ....fi 語句;

if(如果) [ expression ]中expression表達式成立(true)then(那么)執行then后面的語句,反之不會執行。Fi表示結束,if和fi必須成對出現。注意:expression 和方括號([ ])之間必須有空格,否則會有語法錯誤。

例句:

#!/bin/sh

a=10

b=20

if [ $a == $b ]

then

   echo "a is equal to b"

fi

if [ $a != $b ]

then

   echo "a is not equal to b"

fi

運行結果:

a is not equal to b

解釋:(2if(如果) [ expression ]..then xxx else(否則) xxxx.. fi 語句;

if [ expression ]

then

   Statement(s) to be executed if expression is true

else

   Statement(s) to be executed if expression is not true

fi

如果 expression 返回 成立(true),那么 then 后邊的語句將會被執行;否則,執行 else 后邊的語句。

 

#!/bin/sh

a=10

b=20

if [ $a == $b ]

then

   echo "a is equal to b"

else

   echo "a is not equal to b"

fi

執行結果:

a is not equal to b

解釋:(3if [ expression ] then xxx  elif then xxxx... else xxx... fi 語句。

哪一個expression表達式成立就只想對應的哪一個then后面的。反之就執行else后面的。

if [ expression ] then xxx  elif then xxxx... fi

哪一個expression表達式成立就只想對應的哪一個then后面的。反之就不止執行。

舉例:

#!/bin/sh

a=10

b=20

 

if [ $a == $b ]

then

   echo "a is equal to b"

elif [ $a -gt $b ]

then

   echo "a is greater than b"

elif [ $a -lt $b ]

then

   echo "a is less than b"

else

   echo "None of the condition met"

fi

運行結果:

a is less than b

 

 

 

 

if ... else 語句也可以寫成一行,以命令的方式來運行,像這樣:

if test $[2*3] -eq $[1+5]; then echo 'The two numbers are equal!'; fi;

if ... else 語句也經常與 test 命令結合使用,如下所示:

num1=$[2*3]

num2=$[1+5]

if test $[num1] -eq $[num2]

then

    echo 'The two numbers are equal!'

else

    echo 'The two numbers are not equal!'

fi

輸出:

The two numbers are equal!

test 命令用於檢查某個條件是否成立,與方括號([ ])類似。

Shell case esac語句

case 語句匹配一個值或一個模式,如果匹配成功,執行相匹配的命令。case語句格式如下:

case 值 in

模式1)

    command1

    command2

    command3

    ;;

模式2)

    command1

    command2

    command3

    ;;

*)

    command1

    command2

    command3

    ;;

esac

case工作方式如上所示。取值后面必須為關鍵字 in,每一模式必須以右括號結束。取值可以為變量或常數。匹配發現取值符合某一模式后,其間所有命令開始執行直至 ;;。;; 與其他語言中的 break 類似,意思是跳到整個 case 語句的最后。

取值將檢測匹配的每一個模式。一旦模式匹配,則執行完匹配模式相應命令后不再繼續其他模式。如果無一匹配模式,使用星號 * 捕獲該值,再執行后面的命令。

下面的腳本提示輸入1到4,與每一種模式進行匹配:

echo 'Input a number between 1 to 4'

echo -e 'Your number is:\c'

read aNum

case $aNum in

    1)  echo 'You select 1'

    ;;

    2)  echo 'You select 2'

    ;;

    3)  echo 'You select 3'

    ;;

    4)  echo 'You select 4'

    ;;

    *)  echo 'You do not select a number between 1 to 4'

    ;;

esac

輸入不同的內容,會有不同的結果,例如:

Input a number between 1 to 4

Your number is:3

You select 3

 

Shell for循環

for循環一般格式為:

for 變量 in 列表

do

    command1

    command2

    ...

    commandN

done

列表是一組值(數字、字符串等)組成的序列,每個值通過空格分隔。每循環一次,就將列表中的下一個值賦給變量。

in 列表是可選的,如果不用它,for 循環使用命令行的位置參數。

例如,順序輸出當前列表中的數字:

for loop in 1 2 3 4 5

do

    echo "The value is: $loop"

done

運行結果:

The value is: 1

The value is: 2

The value is: 3

The value is: 4

The value is: 5

 

順序輸出字符串中的字符:

for str in 'This is a string'

do

    echo $str

done

運行結果:

This is a string

顯示主目錄下以 .bash 開頭的文件:

#!/bin/bash

for FILE in $HOME/.bash*

do

   echo $FILE

done

運行結果:

/root/.bash_history

/root/.bash_logout

/root/.bash_profile

/root/.bashrc

Shell while循環

 

while循環用於不斷執行一系列命令,也用於從輸入文件中讀取數據;命令通常為測試條件。其格式為:

while command

do

   Statement(s) to be executed if command is true

done

命令執行完畢,控制返回循環頂部,從頭開始直至測試條件為假。

 

以下是一個基本的while循環,測試條件是:如果COUNTER小於5,那么返回 true。COUNTER從0開始,每次循環處理時,COUNTER加1。運行上述腳本,返回數字1到5,然后終止。

COUNTER=0

while [ $COUNTER -lt 5 ]

do

    COUNTER='expr $COUNTER+1'

    echo $COUNTER

done

運行腳本,輸出:

1

2

3

4

5

 

while循環可用於讀取鍵盤信息。下面的例子中,輸入信息被設置為變量FILM,按<Ctrl-D>結束循環。

echo 'type <CTRL-D> to terminate'

echo -n 'enter your most liked film: '

while read FILM

do

    echo "Yeah! great film the $FILM"

done

運行腳本,輸出類似下面:

type <CTRL-D> to terminate

enter your most liked film: Sound of Music

Yeah! great film the Sound of Music

Shell跳出循環

break命令

break命令允許跳出所有循環(終止執行后面的所有循環)

#!/bin/bash

while :

do

    echo -n "Input a number between 1 to 5: "

    read aNum

    case $aNum in

        1|2|3|4|5) echo "Your number is $aNum!"

        ;;

        *) echo "You do not select a number between 1 to 5, game is over!"

            break

        ;;

    esac

done

continue命令

continue命令

 

continue命令與break命令類似,只有一點差別,它不會跳出所有循環,僅僅跳出當前循環。

 

對上面的例子進行修改:

#!/bin/bash

while :

do

    echo -n "Input a number between 1 to 5: "

    read aNum

    case $aNum in

        1|2|3|4|5) echo "Your number is $aNum!"

        ;;

        *) echo "You do not select a number between 1 to 5!"

            continue

            echo "Game is over!"

        ;;

    esac

done

運行代碼發現,當輸入大於5的數字時,該例中的循環不會結束,語句

純文本復制

echo "Game is over!"

永遠不會被執行。

 

Shell函數

函數就是把一段代碼整理到一個小單元中,並給這個小單元起一個名字,當用到這段代碼時直接調用這個小單元的名字即可

格式:function f_name {

             commad

}

函數必須要放到最前面。

1:

#!Bin/bash

sum(){

s=#[$1+$2+¥3]

echo $s

sum 1 2 3

}

說明:sum為一個加法運算函數,$1和$2 位第一個參數,第二個參數,sum 就是sum參數即:1+2+3。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM