【學習】Linux Shell指令碼程式設計

dav2100發表於2021-09-09

1.指令碼的組成和執行

Linux shell指令碼的結構並不複雜,其主要由變數、內部命令以及shell的語法結構和一些函式、其他命令列的程式等組成,以下是一個簡單的shell指令碼。

#!/bin/bash
#This is a first scriptechoecho Hello Bash Script!echo

一般使用字尾名“.sh”來表示shell指令碼,此指令碼中的第一行使用“#!”開頭,表明要用/bin/bash來解釋和執行這個指令碼檔案,也可以使用/bin/sh來代替。實際上,/bin/sh是一個指向/bin/bash的軟連結(soft link),也就是說,在執行/bin/sh 時,它呼叫的命令與/bin/bash 是相同的。可以使用如下的命令來檢視/bin/bash檔案。

autotest@xa-stf-u1804:~/Documents$ ll -la /bin/bash-rwxr-xr-x 1 root root 1113504 Apr  4  2018 /bin/bash*

接著是關於這個指令碼的一些描述資訊,這些描述資訊包括編寫指令碼的時間、人物以及指令碼的功能等資訊,這也許是為了方便後來對指令碼的維護。

之後是指令碼所要實現的功能,這是指令碼最為主要的部分,也是編寫指令碼的目的。當指令碼編寫完成之後儲存指令碼並退出,執行指令碼可以事先使用chmod命令為該指令碼檔案新增可執行權,然後再執行,或者接著使用bash後接指令碼檔名執行。

[scat@Scat ~]$ chmod u+x helloscript.sh    # 新增可執行權
[scat@Scat ~]$ ./helloscript.sh# 執行指令碼檔案
Hello Bash Script![scat@Scat ~]$ bash helloscript.sh# 使用bash 來執行
Hello Bash Shell Script!

在一個剛建立的指令碼檔案中,是沒有可執行許可權的。因此在執行它時會出現不允許執行的提示。而在新增可執行許可權之後就可以執行。

2.指令碼執行過程的追蹤

對於一個剛完成編寫的程式碼程式,無論技術有多麼熟練都難免出現錯誤,所出現的這些錯誤包括語法錯誤和邏輯錯誤。若是遇到語法錯誤還好,要是邏輯錯誤那就麻煩了。這是因為有邏輯錯誤的程式可以正常執行,但所執行的結果並非想要的。

對於所編寫的指令碼,可以使用set命令進行執行時的跟蹤。利用set命令有助於完成程式碼、發現程式碼中的錯誤以及修改和整理程式碼,使得所編寫的程式碼更為完整。看如下一個名為test.sh的指令碼。

圖片描述

#!ban/bash
#
#set -xecho -n "are you a student?"read answerif [ $answer = Y ]then
    echo "yes,I am a student"else
    echo "No,I am a teacher"fi

圖片描述

完成指令碼的編寫之後,將其儲存並退出。接著進行授權,然後執行指令碼檔案。或者使用bash直接執行,操作如下。

圖片描述

[scat@Scat ~]$ bash test.sh   # 執行指令碼檔案
are you a student?Y     # 輸入Y確認,需要大寫
yes,I am a student
[scat@Scat ~]$ bash test.share you a student?N     # 此次輸入N
No,I am a teacher

圖片描述

以上只是一些簡單的輸出,沒有任何其他引數的輸出。接著使用set命令來實現對指令碼的跟蹤。

首先開啟set的功能,即將set命令前面的#號去掉,之後儲存所做修改並退出,然後執行bash命令。

 

圖片描述

[scat@Scat ~]$ bash test.sh   # 執行test.sh檔案+echo-n 'are you a student?'are you a student?+read answer
Y          # 輸入Y,要大寫+'[' Y = Y ']'yes,I am a student
[scat@Scat ~]$ bash test.sh   # 再次執行指令碼檔案+echo-n 'are you a student?'are you a student?+read answer
N          # 此次輸入N+'[' N = Y ']'+echo 'No,I am a teacher'No,I am a teacher

圖片描述

 

在啟動set命令功能之後,當執行指令碼檔案時出現了一些以“+”開頭的行。也就是說,使用set命令可對指令碼進行完全的跟蹤。可以透過跟蹤來發現理想的輸出與實際輸出的區別,然後進行修改,最終達到所需的要求。
3.指令碼中的條件測試
下面介紹指令碼中的條件測試。這方面的內容涉及數值的測試、字串以及數字等內容。
(1)數值測試
對數值進行測試,其主要是對兩個數值進行比較,比較的結果包括兩個數值相等、不相等以及大於和小於等,表中列出了常用的數值關係運算子。
[object Object]

 

下面演示如何使用這些關係運算子進行數值的測試。其實,進行數值比較的測試非常簡單。首先使用編輯器vi建立名為test1.sh的檔案,然後寫入需要測試的數值,儲存之後退出。

圖片描述

#!ban/bash
#
[ 36 -eq 36 ]     # 判斷36是否等於36echo $?echo             # 使用echo命令輸出一個空格[ 36 -eq 35 ]     # 判斷36是否等於35echo $?echo[ 36 -gt 30 ]     # 判斷36是否大於30echo $?

圖片描述

以上的每條判斷語句都可以單獨來寫,這裡為了方便而將它們寫在一起進行測試。完成以上的操作之後,接著開始執行指令碼檔案。注意,輸出0表示正確,也就是說,條件成立,而1則相反,執行檔案及測試結果如下所示。
[scat@Scat ~]$ bash test1.sh0      # 第一個輸出為0,說明條件成立1      # 第二個輸出為1,說明條件不成立0      # 輸出0,說明條件成立

(2)字串測試

對於字串的測試,可以對單個字串進行,也可以對多個字串進行。可透過對兩個字串的值進行比較來測試字串是否相等。表15-2列出了進行字串測試時常用的關係運算子。

圖片描述

接著演示如何使用這些關係運算子進行字串的測試。其實,進行字串比較的測試非常簡單。首先建立名為test2.sh的指令碼檔案,其內容如下。

圖片描述

01 #!/bin/bash02 [ "ccc" = "ccb" ]# 使用"="來判斷這兩個字串是否相等,不用雙引號也行03 echo $?04 echo05 [ "ccc" != "ccb" ]   # 判斷字串是否不相等06 echo $?07 echo08 test2="abc"# 定義test2 的值為abc09 [-z $test2 ]# 判斷test2 是否為空10 echo $?11 exit 0

圖片描述

完成以上的寫入並進行儲存之後,接著開始執行指令碼檔案。執行檔案及測試結果如下所示。

1   # 輸出1,表示第一個測試結果的成立0   # 輸出0,表示測試結果成立1

(3)邏輯運算子

在完成以上指令碼檔案的建立之後,到目前為止已經存在4個指令碼檔案。在這4個指令碼檔案中,只有一個檔案擁有可執行權,下面使用ll命令列出這些指令碼檔案。

圖片描述

[scat@Scat ~]$ ll
total 16-rwxrw-r-- 1 scat scat 76 Nov 6 14:05 helloscript.sh-rw-rw-r-- 1 scat scat 77 Nov 6 19:13 test1.sh-rw-rw-r-- 1 scat scat 91 Nov 6 19:23 test2.sh-rw-rw-r-- 1 scat scat 159 Nov 6 15:17 test.sh

圖片描述

對於這些檔案,若需要對其型別、許可權以及長度等進行檢測時,可使用檔案狀態檢測運算子(如表15-3所示)來測試,如下是一個簡單的例子。

01 [-x helloscript.sh ]  # 判斷helloscript.sh是否有可執行權02 echo $?03 echo04 [-x test1.sh    # 判斷test1.sh是否有可執行權05 echo $?

完成之後,將內容進行儲存並退出,之後執行test3.sh檔案。

0   # 輸出0,表示helloscript.sh檔案擁有可執行權1   # 輸出1,表示test1.sh沒有可執行權

圖片描述

本節的重點是針對多個條件進行測試。要對多個條件進行測試,需要使用一些邏輯運算子,透過邏輯運算子將這些需要進行測試的條件進行連線起來。

shell所提供的邏輯運算子有邏輯與、邏輯或和邏輯否這三種,以下是對各個邏輯運算子的簡單介紹。

 -a:邏輯與,僅當兩邊的條件都為真時,結果才為真,否則為假。 

 -o:邏輯或,只要其中一邊的條件為真,結果就為真。

 !:邏輯否,當條件為假時,結果為真。

接著演示如何使用這些邏輯關係運算子進行檔案屬性的測試。其實,進行檔案屬性的比較測試的操作與之前的操作差不多。首先使用編輯器建立名為 test4.sh 的檔案,然後寫入需要測試的字串,之後儲存所做修改並退出。

圖片描述

01 #!/bin/bash02 #03 [-x helloscript.sh-a-x test2.sh ]04 echo $?05 echo06 [-x helloscript.sh-o-x test2.sh ]07 echo $?

圖片描述

說明:

第03行,當兩個檔案都有可執行權時為真

第06行:當其中有一個檔案有可執行權時為真

完成之後,將內容進行儲存並退出,之後執行test4.sh檔案。

[scat@Scat ~]$ bash test4.sh1  # 第一個測試結果為假0  # 第二個測試結果為真

1.指令碼的組成和執行

Linux shell指令碼的結構並不複雜,其主要由變數、內部命令以及shell的語法結構和一些函式、其他命令列的程式等組成,以下是一個簡單的shell指令碼。

#!/bin/bash
#This is a first scriptechoecho Hello Bash Script!echo

一般使用字尾名“.sh”來表示shell指令碼,此指令碼中的第一行使用“#!”開頭,表明要用/bin/bash來解釋和執行這個指令碼檔案,也可以使用/bin/sh來代替。實際上,/bin/sh是一個指向/bin/bash的軟連結(soft link),也就是說,在執行/bin/sh 時,它呼叫的命令與/bin/bash 是相同的。可以使用如下的命令來檢視/bin/bash檔案。

autotest@xa-stf-u1804:~/Documents$ ll -la /bin/bash-rwxr-xr-x 1 root root 1113504 Apr  4  2018 /bin/bash*

接著是關於這個指令碼的一些描述資訊,這些描述資訊包括編寫指令碼的時間、人物以及指令碼的功能等資訊,這也許是為了方便後來對指令碼的維護。

之後是指令碼所要實現的功能,這是指令碼最為主要的部分,也是編寫指令碼的目的。當指令碼編寫完成之後儲存指令碼並退出,執行指令碼可以事先使用chmod命令為該指令碼檔案新增可執行權,然後再執行,或者接著使用bash後接指令碼檔名執行。

[scat@Scat ~]$ chmod u+x helloscript.sh    # 新增可執行權
[scat@Scat ~]$ ./helloscript.sh# 執行指令碼檔案
Hello Bash Script![scat@Scat ~]$ bash helloscript.sh# 使用bash 來執行
Hello Bash Shell Script!

在一個剛建立的指令碼檔案中,是沒有可執行許可權的。因此在執行它時會出現不允許執行的提示。而在新增可執行許可權之後就可以執行。

2.指令碼執行過程的追蹤

對於一個剛完成編寫的程式碼程式,無論技術有多麼熟練都難免出現錯誤,所出現的這些錯誤包括語法錯誤和邏輯錯誤。若是遇到語法錯誤還好,要是邏輯錯誤那就麻煩了。這是因為有邏輯錯誤的程式可以正常執行,但所執行的結果並非想要的。

對於所編寫的指令碼,可以使用set命令進行執行時的跟蹤。利用set命令有助於完成程式碼、發現程式碼中的錯誤以及修改和整理程式碼,使得所編寫的程式碼更為完整。看如下一個名為test.sh的指令碼。

圖片描述

#!ban/bash
#
#set -xecho -n "are you a student?"read answerif [ $answer = Y ]then
    echo "yes,I am a student"else
    echo "No,I am a teacher"fi

圖片描述

完成指令碼的編寫之後,將其儲存並退出。接著進行授權,然後執行指令碼檔案。或者使用bash直接執行,操作如下。

圖片描述

[scat@Scat ~]$ bash test.sh   # 執行指令碼檔案
are you a student?Y     # 輸入Y確認,需要大寫
yes,I am a student
[scat@Scat ~]$ bash test.share you a student?N     # 此次輸入N
No,I am a teacher

圖片描述

以上只是一些簡單的輸出,沒有任何其他引數的輸出。接著使用set命令來實現對指令碼的跟蹤。

首先開啟set的功能,即將set命令前面的#號去掉,之後儲存所做修改並退出,然後執行bash命令。

 

圖片描述

[scat@Scat ~]$ bash test.sh   # 執行test.sh檔案+echo-n 'are you a student?'are you a student?+read answer
Y          # 輸入Y,要大寫+'[' Y = Y ']'yes,I am a student
[scat@Scat ~]$ bash test.sh   # 再次執行指令碼檔案+echo-n 'are you a student?'are you a student?+read answer
N          # 此次輸入N+'[' N = Y ']'+echo 'No,I am a teacher'No,I am a teacher

圖片描述

 

在啟動set命令功能之後,當執行指令碼檔案時出現了一些以“+”開頭的行。也就是說,使用set命令可對指令碼進行完全的跟蹤。可以透過跟蹤來發現理想的輸出與實際輸出的區別,然後進行修改,最終達到所需的要求。
3.指令碼中的條件測試
下面介紹指令碼中的條件測試。這方面的內容涉及數值的測試、字串以及數字等內容。
(1)數值測試
對數值進行測試,其主要是對兩個數值進行比較,比較的結果包括兩個數值相等、不相等以及大於和小於等,表中列出了常用的數值關係運算子。
[object Object]

 

下面演示如何使用這些關係運算子進行數值的測試。其實,進行數值比較的測試非常簡單。首先使用編輯器vi建立名為test1.sh的檔案,然後寫入需要測試的數值,儲存之後退出。

圖片描述

#!ban/bash
#
[ 36 -eq 36 ]     # 判斷36是否等於36echo $?echo             # 使用echo命令輸出一個空格[ 36 -eq 35 ]     # 判斷36是否等於35echo $?echo[ 36 -gt 30 ]     # 判斷36是否大於30echo $?

圖片描述

以上的每條判斷語句都可以單獨來寫,這裡為了方便而將它們寫在一起進行測試。完成以上的操作之後,接著開始執行指令碼檔案。注意,輸出0表示正確,也就是說,條件成立,而1則相反,執行檔案及測試結果如下所示。
[scat@Scat ~]$ bash test1.sh0      # 第一個輸出為0,說明條件成立1      # 第二個輸出為1,說明條件不成立0      # 輸出0,說明條件成立

(2)字串測試

對於字串的測試,可以對單個字串進行,也可以對多個字串進行。可透過對兩個字串的值進行比較來測試字串是否相等。表15-2列出了進行字串測試時常用的關係運算子。

圖片描述

接著演示如何使用這些關係運算子進行字串的測試。其實,進行字串比較的測試非常簡單。首先建立名為test2.sh的指令碼檔案,其內容如下。

圖片描述

01 #!/bin/bash02 [ "ccc" = "ccb" ]# 使用"="來判斷這兩個字串是否相等,不用雙引號也行03 echo $?04 echo05 [ "ccc" != "ccb" ]   # 判斷字串是否不相等06 echo $?07 echo08 test2="abc"# 定義test2 的值為abc09 [-z $test2 ]# 判斷test2 是否為空10 echo $?11 exit 0

圖片描述

完成以上的寫入並進行儲存之後,接著開始執行指令碼檔案。執行檔案及測試結果如下所示。

1   # 輸出1,表示第一個測試結果的成立0   # 輸出0,表示測試結果成立1

(3)邏輯運算子

在完成以上指令碼檔案的建立之後,到目前為止已經存在4個指令碼檔案。在這4個指令碼檔案中,只有一個檔案擁有可執行權,下面使用ll命令列出這些指令碼檔案。

圖片描述

[scat@Scat ~]$ ll
total 16-rwxrw-r-- 1 scat scat 76 Nov 6 14:05 helloscript.sh-rw-rw-r-- 1 scat scat 77 Nov 6 19:13 test1.sh-rw-rw-r-- 1 scat scat 91 Nov 6 19:23 test2.sh-rw-rw-r-- 1 scat scat 159 Nov 6 15:17 test.sh

圖片描述

對於這些檔案,若需要對其型別、許可權以及長度等進行檢測時,可使用檔案狀態檢測運算子(如表15-3所示)來測試,如下是一個簡單的例子。

01 [-x helloscript.sh ]  # 判斷helloscript.sh是否有可執行權02 echo $?03 echo04 [-x test1.sh    # 判斷test1.sh是否有可執行權05 echo $?

完成之後,將內容進行儲存並退出,之後執行test3.sh檔案。

0   # 輸出0,表示helloscript.sh檔案擁有可執行權1   # 輸出1,表示test1.sh沒有可執行權

圖片描述

本節的重點是針對多個條件進行測試。要對多個條件進行測試,需要使用一些邏輯運算子,透過邏輯運算子將這些需要進行測試的條件進行連線起來。

shell所提供的邏輯運算子有邏輯與、邏輯或和邏輯否這三種,以下是對各個邏輯運算子的簡單介紹。

 -a:邏輯與,僅當兩邊的條件都為真時,結果才為真,否則為假。 

 -o:邏輯或,只要其中一邊的條件為真,結果就為真。

 !:邏輯否,當條件為假時,結果為真。

接著演示如何使用這些邏輯關係運算子進行檔案屬性的測試。其實,進行檔案屬性的比較測試的操作與之前的操作差不多。首先使用編輯器建立名為 test4.sh 的檔案,然後寫入需要測試的字串,之後儲存所做修改並退出。

圖片描述

01 #!/bin/bash02 #03 [-x helloscript.sh-a-x test2.sh ]04 echo $?05 echo06 [-x helloscript.sh-o-x test2.sh ]07 echo $?

圖片描述

說明:

第03行,當兩個檔案都有可執行權時為真

第06行:當其中有一個檔案有可執行權時為真

完成之後,將內容進行儲存並退出,之後執行test4.sh檔案。

[scat@Scat ~]$ bash test4.sh1  # 第一個測試結果為假0  # 第二個測試結果為真

原文出處:https://www.cnblogs.com/xixiuling/p/10330646.html 

作者: 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4479/viewspace-2820869/,如需轉載,請註明出處,否則將追究法律責任。

相關文章