Linux基礎-shell腳本

1.1 什麼是shell腳本

shell腳本是一些命令的集合。shell腳本能幫助我們很方便地管理服務器,我們可以指定一個任務計劃,定時去執行某個shell腳本以滿足需求。

1.1.1 shell腳本的創建和執行

shell腳本通常都以 .sh爲後綴名。如圖所示,腳本文件first.sh的第1行要以 #!/bin/bash 開頭,表示文件使用的是bash語法。#表示註釋,後面跟一些該腳本的相關注釋內容,以及作者、創建日期或者版本等。

在這裏插入圖片描述
下面執行這個腳本,如圖所示。

在這裏插入圖片描述
其實shell腳本還有一種執行方法,使用該方法運行shell腳本的前提是腳本本身有執行權限,所以需要給腳本加一個x權限。

在這裏插入圖片描述
另外,使用sh命令執行一個shell腳本時,可以加 -x 選項來查看這個腳本的執行過程,有利於我們調試這個腳本,如圖所示。

在這裏插入圖片描述
如果腳本里打錯字符,執行命令時會提示你哪行出了錯誤,然後輸入編輯命令的時候,後面+錯誤的行數,光標會自動跳到錯誤的行數。(例如,第7行錯了,命令:vi first.sh +7)

在這裏插入圖片描述

1.1.2 命令date
date命令在shell腳本中最常用的幾個用法如下。
  1. date +%Y:表示以四位數字格式打印年份
  2. date +%y:表示以兩位數字格式打印年份
  3. date +%m:表示月份
  4. date +%d:表示日期
  5. date +%H:表示小時
  6. date +%M:表示分鐘
  7. date +%S:表示秒
  8. date +%w:表示星期。結果顯示0則表示週日

例如:

在這裏插入圖片描述

1.2 shell腳本中的變量

定義變量的格式爲:“變量名=變量的值”。在腳本中引用變量需要加上符號$。下面編寫一個與變量相關的腳本,如圖。

在這裏插入圖片描述
上圖圈起來的地方爲反引號,它的作用時將引號中的字符串當成shell命令執行,返回命令的執行結果。d和d1在腳本中作爲變量出現。sleep 2相當於一個定時器,意思就是等待兩秒然後返回值。下面來看看該腳本的執行結果,如圖。

在這裏插入圖片描述

1.2.1 數學運算
命令如下

在這裏插入圖片描述
數學計算要用 [ ] 括起來,並且前面要加符號$。sum=那裏不要有空格,不然會出錯。該腳本的結果如下:

在這裏插入圖片描述

1.2.2 和用戶交互
示例腳本如下:

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

在這裏插入圖片描述
可以加上 -x 選項來看看這個執行過程:

在這裏插入圖片描述

1.2.3 shell腳本預設變量

有時我們會用到類似 /etc/init.d/iptables restart 的命令,前面的 /etc/init.d/iptables 文件其實就是一個shell腳本。後面爲什麼可以跟 restart 字符串?這就涉及shell腳本的預設變量。實際上,shell腳本在執行時,後面可以跟一個或者多個參數。例如下面的腳本:

在這裏插入圖片描述
該腳本的執行結果如下:

在這裏插入圖片描述
腳本中的$1和$2就是shell腳本的預設變量。本例中,$1和$2的值就是在執行時分別輸入的2和4,$1就是腳本的第一個參數,$2就是腳本的第二個參數,當然一個shell腳本的預設變量是沒有限制的。

另外還有一個$0,它代表腳本本身的名字。,如圖。

在這裏插入圖片描述
該腳本的執行結果如下:
在這裏插入圖片描述

1.3 shell腳本中的邏輯判斷
在shell腳本中,我們同樣可以使用if邏輯判斷。
1.3.1 不帶else
具體格式如下:
if	判斷語句;then
	command
fi

示例腳本如下:
在這裏插入圖片描述
if1.sh中出現了 ((a<60)) 這樣的形式,就是shell腳本中特有的格式,只用一個小括號或者不用都會報錯。

該腳本的執行結果如下:

在這裏插入圖片描述

1.3.2 帶有else
具體格式如下:
if	判斷語句;then
	command
else
	command
fi

示例腳本如下:
在這裏插入圖片描述
該腳本的執行結果如下:
在這裏插入圖片描述
腳本if2.sh和腳本if1.sh唯一區別是:如果輸入大於或等於60的數字會有提示。

1.3.3 帶有elif
具體格式如下:
if	判斷語句1;then
	command
elif 判斷語句2;then
	command
else
	command
fi

示例腳本如下:
在這裏插入圖片描述
這裏的&&表示 “ 並且 ” 的意思,也可以使用 | | 表示 “ 或者 ”。

該腳本的執行結果如下:

在這裏插入圖片描述
以上只是簡單介紹了if語句的結構。判斷數值大小除了可以用 (( )) 的形式外,還可以使用 [ ]。但是不能使用>、<、=這樣的符號了,要使用 -lt(小於)、-gt(大於)、-le(小於等於)、-ge(大於等於)、-eq(等於)、-ne(不等於)。
示例代碼如下:

# a=10; if [ $a -lt 5 ]; then echo ok; fi
# a=10; if [ $a -gt 5 ]; then echo ok; fi
ok
# a=10; if [ $a -ge 10 ]; then echo ok; fi
ok
# a=10; if [ $a -eq 10 ]; then echo ok; fi
ok
# a=10; if [ $a -ne 10 ]; then echo ok; fi

下面是在if語句中使用&&和 | | 的情況,示例代碼如下:

# a=10; if [ $a -lt 1 ] || [$a -gt 5 ]; then echo ok; fi
ok
# a=10; if [ $a -gt 1 ] || [$a -lt 10 ]; then echo ok; fi
ok
1.3.4 和文檔相關的判斷

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

  • -e:判斷文件或目錄是否存在
  • -d:判斷是不是目錄以及是否存在
  • -f:判斷是不是普通文件以及是否存在
  • -r:判斷是否有讀權限
  • -w:判斷是否有寫權限
  • -x:判斷是否可執行

使用if判斷時的具體格式如下:

if [ -e filename ]; then
	command
fi

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

1.3.5 case邏輯判斷
在shell腳本中,除了用if開判斷邏輯外,還有一種常用的方式——case。其具體格式如下:
case  變量  in
value1)
		command
		;;
value2)
		command
		;;
value3)
		command
		;;
*)
		command
		;;
esac

上面的結構中,不限制value的個數,*代表其他值。下面寫一個判斷輸入數值是奇數還是偶數的腳本,如圖。在這裏插入圖片描述
腳本中$a的值爲1或0,其執行結果如下:
在這裏插入圖片描述

1.4 shell腳本中的循環
常用到的循環有for循環和while循環。
1.4.1 for循環

先寫個簡單的for循環腳本,如圖。

在這裏插入圖片描述
腳本中的seq 1 5表示從1到5的一個序列。該腳本的執行結果如下:
在這裏插入圖片描述
通過這個腳本可以看到for循環二點基本結果,具體格式如下:

for 變量名 in 循環的條件;do
	command
done

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

1.4.2 while循環
具體格式如下:
while 條件; do
	 command
done

示例腳本如下:
在這裏插入圖片描述
該腳本的執行結果如下:
在這裏插入圖片描述
另外,可以用一個冒號代替循環條件,這樣可以做到死循環。示例代碼如下:

while :; do
	command
	sleep 3
done
1.5 shell腳本中的函數

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

寫個簡單的帶有函數功能的shell腳本,示例腳本如下:

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

function 函數名()
{
	command1
	command2
}

注意的是,shell腳本中,函數一定要寫在最前面,不能出現在中間或者最後。

1.6 shell腳本中的中斷和繼續
1.6.1 break

break用在循環中,不管是for或者while都可以。在腳本中使用它,退出該層循環。之所以說層,是因爲有時我們會用到嵌套循環,大循環裏面還有小循環,而break僅是退出那一層循環,它的上層循環不受影響。

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

1.6.2 continue

continue也是使用在循環中的,但和break不同的是,當shell腳本中遇到continue時,結束的不是整個循環,而是本次循環。具體示例如下:

在這裏插入圖片描述
腳本執行結果如下:
在這裏插入圖片描述
當 i 等於3時候,出現了continue,所以結束本次循環,continue後面的語句不再執行,繼續下一次循環。

1.6.3 exit

exit的用法跟break、continue相似。它的作用範圍更大,直接退出整個shell腳本。示例腳本如下:

在這裏插入圖片描述
腳本執行結果如下:
在這裏插入圖片描述

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