目錄
Shell
Shell是一個命令解釋器,它的作用是解釋執(zhí)行用戶輸入的命令及程序等。 用戶每輸入一條命令,Shell就執(zhí)行一條。這種從鍵盤輸入命令,就可以立即得到回應(yīng)的對話方式,稱為交互的方式。
當(dāng)命令或程序語句不在命令行下執(zhí)行,而是通過一個程序文件來執(zhí)行時,該程序文件就被稱為Shell腳本。 在Shell腳本里內(nèi)置了很多命令、語句及循環(huán)控制,然后將這些命令一次性執(zhí)行完畢,這種通過文件執(zhí)行腳本的方式稱為非交互的方式。 Shell腳本語言很適合用于處理純文本型的數(shù)據(jù),而Linux系統(tǒng)中幾乎所有的配置文件、日志文件,以及絕大對數(shù)的啟動文件都是純文本類型的文件。
Shell 腳本的類型
Shell腳本語言是弱類型語言(無須定義變量的類型即可使用),在Unix/Linux中主要有兩大類shell:
一類是 Bourne shell ,另一類是 C shell
Bourne shell 包括 Bourne shell (sh)、Korn shell(ksh)、Bourne Again Shell 三種類型。
C shell包括csh、tcsh兩種類型
查看系統(tǒng)默認(rèn)的shell: echo $SHELL
查看系統(tǒng)支持的shell: cat /etc/shells
Shell腳本的執(zhí)行
Shell腳本的執(zhí)行通??梢圆捎靡韵聨追N方式。
1、bash script-name 或 sh script-name 這是當(dāng)腳本文件本身沒有執(zhí)行權(quán)限時常使用的方法
2、path/script-name 或./script-name 在當(dāng)前路徑下執(zhí)行腳本,需要將腳本文件的權(quán)限改為可執(zhí)行。然后使用腳本的絕對路徑或相對路徑就可以直接執(zhí)行腳本了。
3、source script-name 或 . script-name 這種方法通常是使用source或 “.”(點號)讀入或加載指定的Shell腳本文件,然后依次執(zhí)行指定的Shell腳本中的語句。這些語句將在當(dāng)前父 shell 腳本進(jìn)程中執(zhí)行(其他幾種模式都會啟用新的進(jìn)程執(zhí)行該腳本進(jìn)程)。
Shell腳本編寫規(guī)范
Shell腳本的開發(fā)規(guī)范及習(xí)慣非常重要,雖然這些規(guī)范不是必須要遵守的,但有了好的規(guī)范和習(xí)慣,可以大大提升開發(fā)效率,并能在后期降低對腳本的維護(hù)成本。
1、一個規(guī)范的Shell腳本在第一行會指出由哪個程序(解釋器)來執(zhí)行腳本中的內(nèi)容,這一行內(nèi)容在Linux bash的編程一般為:#!/bin/bash 或 #! /bin/sh bash 與 sh 的區(qū)別 , sh 為 bash的軟連接,大多數(shù)情況下,腳本使用“#!/bin/bash”和“#!/bin/sh”是沒有區(qū)別的,但更規(guī)范的寫法是在腳本的開頭使用 #!/bin/bash
2、在shell腳本中,跟在 # 后面的內(nèi)容表示注釋,用來對腳本進(jìn)行注釋說明,注釋部分不會被當(dāng)做程序來執(zhí)行,僅僅是給開發(fā)者和使用者看的,系統(tǒng)解釋器是看不到的,更不會執(zhí)行。注釋可以自成一行,也可以跟在腳本命令的后面與命令在同一行。 注釋盡量不要使用中文,在腳本中最好也不要有中文。
3、Shell腳本的開頭會加版本、版權(quán)等信息
# Date:16:29 2018-10-20
# Author: Create by xiaoxie
# Description: This script function is ……
# Version: 1.1
4、在shell腳本中盡量不用中文注釋,盡量用英文注釋,防止本機或切換系統(tǒng)環(huán)境后中文亂碼的困擾。
5、Shell腳本的命名應(yīng)以.sh為擴展名 例如:1.sh
6、成對的符號應(yīng)盡量一次性寫出來,然后退格在符號內(nèi)增加內(nèi)容,以防止遺漏。這些成對的符號包括: {}、[]、‘’、“” 等
7、中括號[]兩端至少要有1個空格,因此,鍵入中括號時即留出空格[ ],然后在退格鍵入中間內(nèi)容,并確保兩端都至少由一個空格。
8、對于流程控制語句,應(yīng)一次性將格式寫完,再添加內(nèi)容。 如:一次性完成for循環(huán)語句的格式
for
do
內(nèi)容
done
9、通過縮進(jìn)讓代碼更易讀,如:
if 條件內(nèi)容
then
內(nèi)容
fi
10、對于常規(guī)變量的字符串定義變量值應(yīng)加雙引號,并且等號前后不能有空格,需要強引用的,則用單引號(‘’),如果是命令的引用,則用反引號(``)。
11、腳本中的單引號、雙引號及反引號必須為英文狀態(tài)下的符號。
Shell 中的變量
簡單地說,變量就是用一個固定的字符串(也可能是字符、數(shù)字等的組合)代替更多、更復(fù)雜的內(nèi)容,該內(nèi)容里可能還會包含變量、路徑、字符串等其他內(nèi)容。 變量是暫時存儲數(shù)據(jù)的地方及數(shù)據(jù)標(biāo)記,所存儲的數(shù)據(jù)存在于內(nèi)存空間中,通過正確地調(diào)用內(nèi)存中變量的名字就可以讀取出與變量對應(yīng)的數(shù)據(jù)。
變量的賦值方法為: 先寫變量名稱,緊接著是 "=" ,最后是值。中間無任何空格。 通過echo命令加上 $變量名,即可輸出變量的值。 雙引號,以防止出錯變量的值一般要加上。
定義變量時變量名建議用大寫,如 A=simplexue B=99
read -p “提示信息” 變量名 #交互式賦值方法
查看變量內(nèi)容 echo $A 或 echo ${A}
賦值時使用引號的作用
雙引號:允許通過$符號引用其他變量值
單引號:禁止引用其他變量值,$視為普通字符
反撇號:命令替換,提取命令執(zhí)行后的輸出結(jié)果 全局變量的定義方法 export 變量名
位置參數(shù)
位置參數(shù)是一種在調(diào)用 Shell 程序的命令行中按照各自的位置決定的變量,是在程序名之后輸入的參數(shù)。 位置參數(shù)之間用空格分隔,Shell取第一個位置參數(shù)替換程序文件中的 $1,第二個替換 $2 , 依次類推。$0 是一個特殊變量,它的內(nèi)容是當(dāng)前這個shell程序的文件名,所以 $0 不是一個位置參數(shù)。
假如我現(xiàn)在有一個 1.sh腳本文件,內(nèi)容如下
#! /bin/bash
echo $1
echo $(($2+$3))
當(dāng)我執(zhí)行時,我在文件名后加3個參數(shù)
預(yù)定義變量
預(yù)定義變量和環(huán)境變量相類似,也是在Shell一開始就定義的變量,不同的是,用戶只能根據(jù)shell的定義來使用這些變量,所有預(yù)定義變量都是由符號“$”和另一個符號組成。 常見的Shell預(yù)定義變量有以下幾種。
$# :位置參數(shù)的數(shù)量
$* :所有位置參數(shù)的內(nèi)容
$? :命令執(zhí)行后返回的狀態(tài),0表示沒有錯誤,非0表示有錯誤
$$ :當(dāng)前進(jìn)程的進(jìn)程號
$! :后臺運行的最后一個進(jìn)程號
$0 :當(dāng)前執(zhí)行的進(jìn)程名
假如我現(xiàn)在有一個 1.sh腳本文件,內(nèi)容如下
#! /bin/bash
echo $1
echo ${2}+${3}
echo $# #打印出位置參數(shù)的數(shù)量
echo $* #打印出位置參數(shù)的內(nèi)容
echo $? #打印出命令執(zhí)行后返回的狀態(tài)
echo $$ #打印出當(dāng)前進(jìn)程的進(jìn)程號
echo $0 #打印出當(dāng)前進(jìn)程的進(jìn)程名
當(dāng)我執(zhí)行時,我在文件名后加3個參數(shù)
參考文章:
Linux中環(huán)境變量的設(shè)置變量的算術(shù)運算
Shell中常見的算術(shù)運算符
Shell 中常見的算術(shù)運算命令
雙小括號 (()) 數(shù)值運算命令的用法
雙小括號 (()) 的作用是進(jìn)行數(shù)值運算與數(shù)值比較,它的效率很高,用法靈活,是Linux下常用的運算操作符。其操作方法如下:
let 運算命令的用法
let運算命令的語法格式為: let 賦值表達(dá)式
let 賦值表達(dá)式的功能等同于“((賦值表達(dá)式))” 范例: 給變量 i 加8
expr 命令的用法
1、expr 用于運算
語法:expr 表達(dá)式
范例:expr 2 + 2 ; expr 2 – 2 ; expr 2 \* 2 ; expr 2 / 2
注意:運算符號和數(shù)字之間要有空格??!
2、expr配合變量計算
expr在Shell中可配合變量進(jìn)行計算,但需要用反引號將計算表達(dá)式括起來。
3、利用 expr 計算字符串的長度
br 命令的用法
bc 是UNIX/Linux下的計算器,除了作為計算器來使用,還可以作為命令行計算工具使用
交互模式 在shell命令行直接輸入 bc 及能進(jìn)入bc語言的交互模式
bc也可以進(jìn)行非交互式的運算,方法是與 echo 一起使用,所以我們就可以寫在腳本里面
$[] 符號的運算示例
Shell腳本的條件測試
通常,在shell的各種條件結(jié)構(gòu)和流程控制結(jié)構(gòu)中都要進(jìn)行各種測試,然后根據(jù)測試結(jié)果執(zhí)行不同的操作,有時候也會與 if 等條件語句相結(jié)合,來完成測試判斷,以減少程序運行錯誤。
幾種條件測試語句
文件測試操作符
常用文件測試操作符 說明
-d , d的全拼為 directory 文件存在且為目錄則為真
-f , f的全拼為 file 文件存在且為文件則為真
-e , e的全拼為 exists 文件存在則為真
-s ,s的全拼為 size 文件存在且大小不為0則為真
-r ,r的全拼為 read 文件存在且可讀則為真
-w ,w的全拼為write 文件存在且可寫則為真
-x ,x的全拼為executable 文件存在且可執(zhí)行則為真
-L ,L的全拼為link 文件存在且為鏈接文件則為真
f1 -nt f2 ,nt的全拼為 newer than 文件f1比文件f2新則為真
f1 -ot f2 ,ot的全拼為older than 文件f1比文件f2舊則為真
注:(())不能用于文件測試,文件測試一般常用的是 []
字符串測試操作符
常用字符串測試操作符 說明
-n 若字符串長度不為0,則為真
-z 若字符串長度為0,則為真
“字符串1” == “字符串2” 若字符串1等于字符串2,則為真
“字符串1” != “字符串2” 若字符串1不等于字符串2,則為真
注: == 和 != 兩端要有空格 ,(())不能用于字符測試
整數(shù)二元比較操作符
在[]以及test中使用的比較符號 在(())和[[]]中使用的比較符號 說明
-eq == 或 = 相等,全拼為 equal
-ne !=
不相等,全拼為 not equal
-gt > 大于,全拼為 greater than
-ge >= 大于等于,全拼為 greater equal
-lt < 小于,全拼為 less than
-le <= 小于等于 ,全拼為less equal
"="和"!="也可以在[]中作比較使用,但在[]中使用包含"<"和">"的符號時,需要用反斜線轉(zhuǎn)義,有時不轉(zhuǎn)義雖然語法不會報錯,但是結(jié)果可能不對。
也可以在[[]]中使用包含“-gt”和“-lt”的符號,但是不建議使用
比較符號兩端也要有空格,[] (()) [[]] 兩端都要有空格
邏輯操作符
在[]和test中使用的操作符 在[[]]和(())中使用的操作符 說明
-a && and ,與,兩端都為真,才為真
-o || or ,或, 兩端有一個為真,就為真
! ! not ,非, 兩端相反,則結(jié)果為真
測試表達(dá)式 test 、[] 、[[]] 、 (()) 的區(qū)別
測試表達(dá)式符號 test [] [[]] (())
邊界是否需要空格 需要 需要 需要 不需要
邏輯操作符 ! 、-a、 -o ! 、-a、 -o ! 、&& 、 || ! 、&& 、 ||
整數(shù)比較操作符 -eq 、 -gt 、-lt、-ge 、-le -eq 、 -gt 、-lt、-ge 、-le -eq 、 -gt 、-lt、-ge 、-le 或 = 、> 、< 、 >= 、 <= = 、> 、< 、 >= 、 <=
字符串比較操作符 = 、 == 、!= = 、 == 、!= = 、 == 、!= 不支持
文件操作 -d、-f、-e、-r、-s、-w、-x、-L、-nt、-ot -d、-f、-e、-r、-s、-w、-x、-L、-nt、-ot -d、-f、-e、-r、-s、-w、-x、-L、-nt、-ot 不支持
是否支持通配符匹配
不支持
不支持 支持 不支持
if 條件判斷語句
#####單條件判斷##############
if 條件判斷
then
命令
else
命令
fi
#或
if 條件判斷;then
命令
else
命令
fi
###雙條件判斷#####
if 條件判斷
then
命令
elif 條件判斷
then
命令
else
命令
fi
##或
if 條件判斷;then
命令
elif 條件判斷;then
命令
else
命令
fi
if語句對于字符串的匹配
case 條件判斷語句
case條件語句相當(dāng)于多分支的if/elif/ellse條件語句,但是它比這些條件語句看起來更規(guī)范更工整,常被應(yīng)用于實現(xiàn)系統(tǒng)服務(wù)啟動腳本等企業(yè)應(yīng)用場景中。
case 變量 in
one)
命令
;;
two)
命令
;;
*)
命令
esac
for循環(huán)語句
for 條件
do
命令
done
##或
for 條件;do
命令
done
while循環(huán)語句
while 條件
do
命令
done
Break、Continue、exit 循環(huán)控制語句
break 、continue在條件語句及循環(huán)語句(for、while、if等)中用于控制程序走向;而exit則用于終止所有語句并退出當(dāng)前腳本。
命令 說明
break n 如果省略 n ,則表示跳出整個循環(huán),n 表示跳出循環(huán)的成熟
continue n 如果省略 n ,則表示跳過本次循環(huán),忽略本次循環(huán)的剩余代碼,進(jìn)行循環(huán)的下一次循環(huán)。n表示退到第 n 層繼續(xù)循環(huán)
exit n 退出當(dāng)前 shell 程序,n 為上一次程序執(zhí)行的狀態(tài)返回值。n 也可以省略,在下一個 shell 里可通過 $? 接收 exit n 的n值