Shell 是一個用 C 語言編寫的程式,使用者可以通過Shell腳本語言來進行程式開發。與其他腳本語言不同,Shell腳本所需的解釋器一般是内置在作業系統的,而像Node.js、PHP等腳本語言需要手動安裝解釋器程式才可以。
接下來将和大家一起來學習Shell腳本程式設計。
Shell解釋器
Shell解釋器種類衆多,筆者的電腦上内置以下Shell:
/bin/bash/bin/csh/bin/ksh/bin/sh/bin/tcsh/bin/zsh
其中bash和sh是最常見的Shell解釋器,一般情況下,這兩種Shell沒有差別,本文以bash為例。
Hello World
打開文本編輯器(vim或者vscode),建立檔案 hello.sh,擴充名為sh(常用)。
#!/bin/bashecho "Hello World!"
第1行用來指明本腳本需要使用什麼解釋器來執行。
#!
是一個約定的文法。
echo
用來輸出文本。
執行Shell腳本
有兩種方法可以執行Shell腳本:
1.作為可執行程式。給腳本添加可執行權限之後執行即可。
chmod +x ./hello.sh # 添加可執行權限./hello.sh # 執行腳本
2.作為解釋器腳本。直接運作指定的解釋器程式,并将腳本路徑傳入,本方式不要求腳本有可執行權限。
/bin/bash hello.sh # 使用/bin/bash來執行hello.sh
Shell文法
和其他程式設計語言一樣,Shell腳本也有自己的一套文法規則,我們現在來系統學習一下。
變量
命名規則
定義變量時,變量名不加美元符号$,如:
name="xialei"
和其他程式設計語言不同的是,Shell腳本中
變量名和等号之間不能有空格
。Shell變量名的命名規則如下:
•隻能包含英文字母、數字和下劃線,且不能以數字開頭•不能包含空格•不能使用關鍵字命名(通過下劃線連接配接關鍵字是允許的)•不能使用标點符号
以下是合法的示例
var1var_2_var3MAX_PAGE
以下是不合法的示例
$var
指派
Shell有以下兩種複制方式。
1.直接指派。直接在等号後面指定變量值。
name="xialeiadmin=1
2.使用指令執行結果。可以将其他指令的執行結果指派給變量。(以下兩種方式是等效的)
file=`ls /etc` # 反引号(鍵盤Tab上面的鍵)file1=$(ls /etc)
已經存在的變量,可以被重新指派。
name="hello"echo $namename="world"echo $name
使用變量
使用變量時在變量名前添加$符号,定義時不加。
name="xialei"echo $nameecho ${name}
變量名兩邊的花括号是可選的,一般情況下不用加,但是如果涉及到邊界識别問題,則需要手動添加花括号。
name="xialei"echo "I'm ${name}studio." # 正确示例echo "I'm $namestudio." # 錯誤示例
如果不添加花括号,Shell會将
namestudio
作為變量,該變量是不存在的,是以代碼執行邏輯就不是我們想要的了。
隻讀變量
如果某些變量在定義後就無法更改該變量的值,可以設定使用
readonly
設定為隻讀變量,對隻讀變量指派會跑出錯誤。
name="xialei"readonly namename="zhangsan"
上述例子執行結果如下
./hello.sh: line 5: name: readonly variable
釋放變量
使用
unset
可以釋放變量。變量被釋放後不能使用(使用不會報錯,shell中使用未定義變量當做空值處理),此外unset指令無法釋放隻讀變量。
name="xialei"unset name # 不要$echo $name
變量類型
Shell腳本運作時,存在以下三種變量:
•局部變量。在腳本中定義的變量,隻對目前腳本有效•環境變量。所有程式都能通路到環境變量,此外Shell腳本也可以在運作時定義環境變量•Shell變量。Shell變量是由Shell解釋器設定的變量。Shell變量中有一部分是局部變量,有一部分是環境變量。
資料類型
Shell支援數字、字元串和數組三種資料類型。下面我們分别進行學習。
字元串
字元串可以使用單引号、雙引号,也可以不使用引号。
單引号
name='xialei'
•單引号内的任何字元都會原樣使用,不解析變量,也不解析轉義字元。這一點和PHP有點類似
雙引号
name='xialei'msg="Hello, ${name}"echo $msg
•雙引号内的字元串會進行變量解析和轉義字元解析
字元串拼接
字元串拼接有以下兩種方式。
引号拼接(支援雙引号和單引号)
name='xialei'msg='Hello '$name', welcome!'echo $msg
内部嵌套(隻支援雙引号,因為單引号不解析變量)
name='xialei'msg="Hello ${name}, welcome!"echo $msg
數組
Shell隻支援一維數組,不限定數組大小。
數組的索引由0開始,讀取元素的索引可以使用整數或表達式。
數組定義
數組元素使用
小括号
括起來,每個元素之間用
空格
分割。
users=(xialei zhangsan lisi)
讀取數組元素
文法如下:
${數組名稱[下标]}
比如上例中讀取第2個人
users=(xialei zhangsan lisi)echo ${users[1]} # 輸出zhangsan
使用
@
作為下标可以擷取數組的所有元素。
users=(xialei zhangsan lisi)echo ${users[@]} # 輸出 xialei zhangsan lisi
擷取數組長度
文法如下
length=${#數組名[@]}
比如輸出users數組的長度
users=(xialei zhangsan lisi)echo ${#users[@]}
今天的内容主要是讓大家對Shell有一個宏觀的認識,介紹了Shell的變量以及資料類型,下一篇将重點介紹Shell的運算符和流程控制。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CZ3kDMyQmN1YDZiNDO2YGMiNmZlNWM1ITN2ImY1kzNl9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
0.jpeg
(未完待續)