Linux中shell腳本解析及課後習題解答----工坊學習記錄--5.2

一、shell腳本

 

1.什麼是shell腳本

 shell腳本並不能作爲正式的編程語言,因爲它是在Linux的shell中運行的,所以稱爲shell腳本。事實上,she腳本就是一些命令的集合。

 

1.1 shell腳本的創建和執行

先編寫第一個shell腳本,如圖
在這裏插入圖片描述
執行腳本第一種,如圖:
在這裏插入圖片描述
 
第二種:
在這裏插入圖片描述
使用該方法運行shell腳本的前提是腳本本身有執行權限,所以需要給腳本加一個x權限。另外,使用sh命令執行一個shell腳本時,可以加-x選項來查看這個腳本的執行過程,這樣有利於我們調試這個腳本。如下所示:
在這裏插入圖片描述
 

1.2 命令 date

用法如下:

  • date +%Y:表示以四位數字格式打印年份。
  • date +%y:表示以兩位數字格式打印年份。
  • date +%m:表示月份。
  • date +%d:表示日期。
  • date +H:表示小時。
  • date +%M:表示分鐘。
  • date +%S:表示秒。
  • date +w:表示星期。結果顯示o則表示週日。

示例:
在這裏插入圖片描述
在腳本中會用到一天前的日期,如下所示:
在這裏插入圖片描述
或者一小時前,如下:
在這裏插入圖片描述
甚至一分鐘前,如下:
在這裏插入圖片描述
 

2. shell腳本中的變量

編寫第一個與變量有關的腳本,如下:
在這裏插入圖片描述

本例中使用到了反引號,它的作用是將引號中的字符串當成shell命令執行,返回命令的執行結果。d和d1在腳本中作爲變量出現。
執行:
在這裏插入圖片描述
 

2.1 數學運算

示例:
在這裏插入圖片描述
數學計算要用[ ]括起來,並且前面要加符號$。該腳本的結果如下:
在這裏插入圖片描述
 

2.2 和用戶交互

示例:
在這裏插入圖片描述
read命令用於和用戶交互,它把用戶輸入的字符串作爲變量值。該腳本的執行過程如下:
在這裏插入圖片描述
 

2.3 shell腳本預設變量

shell腳本在執行時,後面可以跟一個或者多個參數。比如下面的腳本:
在這裏插入圖片描述
執行:
在這裏插入圖片描述
本例中,$1和$2的值就是在執行時分別輸入的1和2,$1就是腳本的第一個參數,$2是腳本的第二個參數,以此類推。當然一個shell腳本的預設變量是沒有限制的。

還有一個$0,它代表腳本本身的名字。我們不妨把腳本修改一下,如下所示:
在這裏插入圖片描述
執行:
在這裏插入圖片描述
 

3. shell腳本中的邏輯判斷

在shell腳本中,我們同樣可以使用if邏輯判斷。
 

3.1 不帶 else

格式如下:

if 判斷語句;then
command
fi

示例:
在這裏插入圖片描述
if1.sh中出現了((a<60))這樣的形式,這是shell腳本中特有的格式,只用一個小括號或者不用都會報錯,請記住這個格式。還會用另外一種格式,後面會介紹到。
執行:
在這裏插入圖片描述
 

3.2 帶有 else

格式如下:
if 判斷語句;then
command
else
command
fi
示例:
在這裏插入圖片描述
執行:
在這裏插入圖片描述
 

3.3 帶有 elif

格式如下:

if 判斷語句1;then
command
elif 判斷語句2;then
command
else
command
fi
示例:
在這裏插入圖片描述
這裏的&&表示“並且”的意思,當然也可以使用||表示“或者”。
執行:
在這裏插入圖片描述
判斷數值大小除了可以用(( ))的形式外,還可以使用[ ]。但是不能使用>、<、=這樣的符號了,要使用-lt(小於)、-gt(大於)、-le(小於或等於)、-ge(大於或等於)、-eq(等於)、-ne(不等於)。下面阿銘就以命令行的形式簡單比較一下,不再寫shel腳本。示例:
下面是在if語句中使用88和|的情況,示例代碼如下:在這裏插入圖片描述
下面是在if語句中使用&&和| |的情況,示例代碼如下:
在這裏插入圖片描述
 

3.4 和文檔相關的判斷

shel腳本中 if 還經常用於判斷文檔的屬性,比如判斷是普通文件還是目錄,判斷文件是否有讀、寫、執行權限等。if 常用的選項有以下幾個。

  • -e:判斷文件或目錄是否存在。
  • -d:判斷是不是目錄以及是否存在。
  • -f:判斷是不是普通文件以及是否存在。
  • -r:判斷是否有讀權限。
  • -w:判斷是否有寫權限。
  • -x:判斷是否可執行。
    使用 if 判斷時的具體格式如下:
    if [-e filename];then
    command
    fi

示例:
在這裏插入圖片描述
因爲/home/是目錄而非文件,所以並不會顯示ok。其他示例如下所示:
在這裏插入圖片描述
 

3.5 case邏輯判斷

在shell腳本中,除了用if來判斷邏輯外,還有一種常用的方式—case。其具體格式如下:
case 變量 in
value1)
command
;;
value2)
command
;;
value3)
command
;;
*)
command
esac
上面的結構中,不限制value的個數,*代表其他值。寫一個判斷輸入數值是奇數還是偶數的腳本,如下所示:
在這裏插入圖片描述

腳本中的$a的值爲1或0,執行:
在這裏插入圖片描述
 

4. shell 腳本中的循環

shell腳本可以算是一種簡易的編程語言了,腳本中的循環也是不能缺少的。常用到的循環有for循環和while循環,下面我們就分別介紹一下這兩種循環結構。

 

4.1 for循環

示例:
在這裏插入圖片描述
腳本中的seq1 5表示從1到5的一個序列。執行:
在這裏插入圖片描述
格式:
for 變量名 in 循環的條件;do
command
done

這裏“循環的條件”可以是一組字符串或者數字(用一個或者多個空格隔開),也可以是一條命令的執行結果
在這裏插入圖片描述
“循環的條件”還可以引用系統命令的執行結果(如seq 1 5),但必須用反引號括起來。示例命令如下:
在這裏插入圖片描述
 

4.2 while 循環

阿銘常常用while循環來編寫死循環的腳本,用於監控某項服務。while循環的格式也很簡單,如下所示:
while 條件;do
command
done

示例、執行 腳本如下:
在這裏插入圖片描述
另外,可以用一個冒號代替循環條件,這樣可以做到死循環。示例代碼如下:
while :;do
command
sleep3
done
 

5. shell 腳本中的函數

shell腳本中的函數就是先把一段代碼整理到一個小單元中,並給這個小單元命名,當用到這段代碼時直接調用這個小單元的名字即可。有時候腳本中的某段代碼總是重複使用,如果寫成函數,每次用到時直接用函數名代替即可,這樣不僅節省時間還節省空間。

示例、執行如下:
在這裏插入圖片描述
func.sh中的sum()爲自定義的函數。在shell腳本中函數的格式如下:

function 函數名()
{
command1
command2
}

值得注意的是,在shell腳本中,函數一定要寫在最前面,不能出現在中間或者最後。因爲函數是要被調用的,如果還沒有出現就被調用,肯定會出錯。

 

6. shell 腳本中的中斷和繼續

在shell腳本循環的過程中,我們難免會遇到一些特殊需求,比如當循環到某個地方時需要做一些事情,這時候很有可能需要退出循環,或者跳過本次循環,這樣的需求如何實現呢?

 

6.1 break

首先有一點需要明白,break用在循環中,不管是for或者while都可以。在腳本中使用它,表示退出該層循環。之所以說層,是因爲有時我們會用到嵌套循環,大循環裏面還有小循環,而break僅僅是退出那一層循環,它的上層循環不受影響。下面寫一個break的示例,如下所示:

在這裏插入圖片描述
腳本中,本意是要把1~5數值賦予i,當i等於3時,會跳出循環,後面的4和5都不會再執行了。該腳本的執行結果如下:
在這裏插入圖片描述
 

6.2 continue

continue也是使用在循環中的,但和break不同的是,當在shell腳本中遇到continue時,結束的不是整個循環,而是本次循環。具體示例如下:
在這裏插入圖片描述
當i等於3的時候,出現了continue,所以結束本次循環,continue後面的語句不再執行,繼續下一次循環。

 

6.3 exit

exit,它的作用範圍更大,直接退出整個shell腳本。示例腳本如下:
在這裏插入圖片描述
 
 

二、課後習題

(1)shell腳本中,怎麼把某一行當作註釋?
答:在某一行前加#號

(2)如何執行一個shell腳本呢?
答: chmod +x 1.sh;或者./1.sh

(3)爲了方便管理,我們約定把shel腳本都放到哪個目錄下?
答:放到 /usr/local/sbin/下

(4)爲了更好地調試shel腳本,我們可以加哪個選項來觀察shell腳本的執行過程?
答: 使用bash -x 1.sh

(5)使用date命令打印5天前的日期。要求:日期格式爲xxxx-xx-xx。
答:date -d “-5 day” +%F

(6)請指出下面這個腳本的問題出在哪裏。
#!/bin/bash
a = 1
b = 2
echo $a,$b

答:賦值變量值的時候,帶了空格

(7)在shell腳本中如何使用數學運算?請舉例說明。
答:
a=2; b=4
c=[[a+$b]
echo $c

(8)shell腳本中的哪個命令可以實現腳本和用戶交互?怎麼使用?
答:
read -p
例如
read -p “Please input a number” n
這樣會把用戶輸入的內容作爲n這個變量的值

(9)在shell中如何進行大小或者等於判斷?
答:大於 -gt 小於是 -lt 等於是 -ne 大於等於是 -ge 小於等於是 -le

(10)在shel腳本中,用什麼符號表示“並且”?用什麼符號表示“或者”?
答:
&& 並且
| | 或者
(11)在shell腳本中,case邏輯判斷的結構是什麼樣的?
答:
case 變量 in
value1)
command
;;
value2)
command
;;
value3)
command
;;
*)
command
esac

(12)列舉shell腳本中常用的循環結構。
答:
for a in … ; do … ; done
while …; do …; done

(13)she腳本中函數的作用是什麼?函數結構是什麼樣的?
答:
函數可以理解成shell腳本中一個小代碼單元,當要用到這段代碼時直接調用函數名即可,從而避免重複書寫這段代碼,提高代碼書寫效率和質量。
函數的結構爲:
function 函數名 ()
{
command1
command2
}

(14)編寫一個shell腳本,在一個目錄下的所有文件(不含目錄)的文件名後面加“.bak”。
答:
#! /bin/bash

for f in find .type f
do
mv $f $f.bak;
done

(15)編寫一個shell腳本,將當前目錄下大於100KB的文件全部移動到/tmp/目錄下。
答:
for f in find . -type f -size +100k;
do
mv $f /tmp/;
done

(16)編寫一個shell腳本,獲取本機的HOSTNAME、IP地址以及DNS地址。

(17)編寫兩個小腳本,驗證break和continue在循環中的作用。
答:如圖
在這裏插入圖片描述

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章