Shell 是一個用 C 語言編寫的程序,用戶能夠經過Shell腳本語言來進行程序開發。與其餘腳本語言不一樣,Shell腳本所需的解釋器通常是內置在操做系統的,而像Node.js、PHP等腳本語言須要手動安裝解釋器程序才能夠。shell
接下來將和你們一塊兒來學習Shell腳本編程。編程
Shell解釋器種類衆多,筆者的電腦上內置如下Shell:vim
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh複製代碼
其中bash和sh是最多見的Shell解釋器,通常狀況下,這兩種Shell沒有區別,本文以bash爲例。數組
打開文本編輯器(vim或者vscode),新建文件 hello.sh,擴展名爲sh(經常使用)。bash
#!/bin/bash
echo "Hello World!"複製代碼
第1行用來指明本腳本須要使用什麼解釋器來執行。#!
是一個約定的語法。編程語言
echo
用來輸出文本。編輯器
有兩種方法能夠執行Shell腳本:學習
chmod +x ./hello.sh # 添加可執行權限
./hello.sh # 執行腳本複製代碼
/bin/bash hello.sh # 使用/bin/bash來執行hello.sh複製代碼
和其餘編程語言同樣,Shell腳本也有本身的一套語法規則,咱們如今來系統學習一下。spa
定義變量時,變量名不加美圓符號$,如:操作系統
name="xialei"複製代碼
和其餘編程語言不一樣的時,Shell腳本中變量名和等號之間不能有空格
。Shell變量名的命名規則以下:
如下是合法的示例
var1
var_2
_var3
MAX_PAGE複製代碼
如下是不合法的示例
$var複製代碼
Shell有如下兩種複製方式。
name="xialei
admin=1複製代碼
file=`ls /etc` # 反引號(鍵盤Tab上面的鍵)
file1=$(ls /etc)複製代碼
已經存在的變量,能夠被從新賦值。
name="hello"
echo $name
name="world"
echo $name複製代碼
使用變量時在變量名前添加$符號,定義時不加。
name="xialei"
echo $name
echo ${name}複製代碼
變量名兩邊的花括號是可選的,通常狀況下不用加,可是若是涉及到邊界識別問題,則須要手動添加花括號。
name="xialei"
echo "I'm ${name}studio." # 正確示例
echo "I'm $namestudio." # 錯誤示例複製代碼
若是不添加花括號,Shell會將namestudio
做爲變量,該變量是不存在的,所以代碼執行邏輯就不是咱們想要的了。
若是某些變量在定義後就沒法更改該變量的值,能夠設置使用readonly
設置爲只讀變量,對只讀變量賦值會跑出錯誤。
name="xialei"
readonly name
name="zhangsan"複製代碼
上述例子執行結果以下
./hello.sh: line 5: name: readonly variable複製代碼
使用unset
能夠釋放變量。變量被釋放後不能使用(使用不會報錯,shell中使用未定義變量當作空值處理),此外unset命令沒法釋放只讀變量。
name="xialei"
unset name # 不要$
echo $name複製代碼
Shell腳本運行時,存在如下三種變量:
Shell支持數字、字符串和數組三種數據類型。下面咱們分別進行學習。
字符串可使用單引號、雙引號,也能夠不使用引號。
單引號
name='xialei'複製代碼
雙引號
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的運算符和流程控制。
(未完待續)