Linux基礎之Shell程式設計
1 概述
Shell是一個命令列直譯器,它為使用者提供了一個向Linux核心傳送請求以便執行程式的介面系統級程式,使用者可以用Shell來啟動、掛起、停止甚至是編寫一些程式
Shell還是一個功能相當強大的程式語言,易編寫、易除錯、靈活性強。Shell是解釋執行的指令碼語言,在Shell中可以呼叫Linux系統命令。
2 shell指令碼的執行方式
1)echo輸出命令
(1)基本語法:
echo [選項] [輸出內容]
選項:
-e: 支援反斜線控制的字元轉換
控制字元 |
作 用 |
\\ |
輸出\本身 |
\a |
輸出警告音 |
\b |
退格鍵,也就是向左刪除鍵 |
\c |
取消輸出行末的換行符。和“-n”選項一致 |
\e |
ESCAPE鍵 |
\f |
換頁符 |
\n |
換行符 |
\r |
回車鍵 |
\t |
製表符,也就是Tab鍵 |
\v |
垂直製表符 |
\0nnn |
按照八進位制ASCII碼錶輸出字元。其中0為數字零,nnn是三位八進位制數 |
\xhh |
按照十六進位制ASCII碼錶輸出字元。其中hh是兩位十六進位制數 |
2)第一個Shell指令碼
(1)需求:建立一個Shell指令碼,輸出helloworld
(2)實操:
[[email protected] datas]$ touch helloworld.sh [[email protected] datas]$ vi helloworld.sh
在helloworld.sh中輸入如下內容 #!/bin/bash echo "helloworld" |
3)指令碼的常用執行方式
第一種:輸入指令碼的絕對路徑或相對路徑
(1)首先要賦予helloworld.sh 指令碼的+x許可權
[[email protected] datas]$ chmod 777 helloworld.sh
(2)執行指令碼
/root/helloWorld.sh
./helloWorld.sh
第二種:bash或sh+指令碼(不用賦予指令碼+x許可權)
sh /root/helloWorld.sh
bash helloWorld.sh
3 shell中的變數
1)Linux Shell中的變數分為“系統變數”和“使用者自定義變數”,可以通過set命令檢視系統變數。
2)系統變數:$HOME、$PWD、$SHELL、$USER等等
3)顯示當前shell中所有變數:set
3.1 定義變數
1)基本語法:
變數=值
2)變數定義規則
(1)變數名稱可以由字母、數字和下劃線組成,但是不能以數字開頭。
(2)等號兩側不能有空格
(3)變數名稱一般習慣為大寫
(4)雙引號和單引號有區別,雙引號僅將空格脫意,單引號會將所有特殊字元脫意
3)案例
3.2 將命令的返回值賦給變數
A=`ls -la` 反引號,執行裡面的命令,並把結果返回給變數A
A=$(ls -la) 等價於反引號
3.3 設定環境變數
1)基本語法:
export 變數名=變數值 (功能描述:設定環境變數的值)
echo $變數名 (功能描述:查詢環境變數的值)
source 配置檔案 (功能描述:讓修改後的配置資訊立即生效)
3.4 位置引數變數
1)基本語法
$n (功能描述:n為數字,$0代表命令本身,$1-$9代表第一到第九個引數,十以上的引數,十以上的引數需要用大括號包含,如${10})
$* (功能描述:這個變數代表命令列中所有的引數,$*把所有的引數看成一個整體)
[email protected] (功能描述:這個變數也代表命令列中所有的引數,不過[email protected]把每個引數區分對待)
$# (功能描述:這個變數代表命令列中所有引數的個數)
‘
’
注意:
a)$*和[email protected]都表示傳遞給函式或指令碼的所有引數,不被雙引號“”包含時,都以$1 $2 …$n的形式輸出所有引數
b)當它們被雙引號“”包含時,“$*”會將所有的引數作為一個整體,以“$1 $2 …$n”的形式輸出所有引數;“[email protected]”會將各個引數分開,以“$1” “$2”…”$n”的形式輸出所有引數
3.5 預定義變數
1)基本語法:
$? (功能描述:最後一次執行的命令的返回狀態。如果這個變數的值為0,證明上一個命令正確執行;如果這個變數的值為非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。)
$$ (功能描述:當前程序的程序號(PID))
$! (功能描述:後臺執行的最後一個程序的程序號(PID))
helloworld是 helloworld.sh 指令碼執行的結果
4 運算子
1)基本語法:
(1)“$((運算式))”或“$[運算式]”
(2)expr m + n
注意expr運算子間要有空格
2)案例:計算(2+3)X4的值
(1)採用$[運算式]方式
(2)expr分佈計算
S=`expr 2 + 3`
expr $S \* 4
(3)expr一步完成計算
注意:不是單引號是反引號,代表執行的命令
5 條件判斷
5.1 判斷語句
1)基本語法:
[ condition ](注意condition前後要有空格)
#非空返回true,可使用$?驗證(0為true,>1為false)
2)案例:
[atguigu] 返回true
[] 返回false
[condition] && echo OK || echo notok 條件滿足,執行後面的語句
5.2 常用判斷條件
1)兩個整數之間比較
= 字串比較
-lt 小於
-le 小於等於
-eq 等於
-gt 大於
-ge 大於等於
-ne 不等於
2)按照檔案許可權進行判斷
-r 有讀的許可權
-w 有寫的許可權
-x 有執行的許可權
3)按照檔案型別進行判斷
-f 檔案存在並且是一個常規的檔案
-e 檔案存在
-d 檔案存在並是一個目錄
4)案例
[[email protected] ~]# [ 23 -ge 22 ]
[[email protected] ~]# [ -w student.txt ]
[[email protected] ~]# [ -e /root/install.log ]
6 流程控制
6.1 if判斷
1)基本語法:
if [ 條件判斷式 ];then
程式
fi
或者
if [ 條件判斷式 ]
then
程式
fi
注意事項:(1)[ 條件判斷式 ],中括號和條件判斷式之間必須有空格
2)案例
6.2 case語句
1)基本語法:
case $變數名 in
"值1")
如果變數的值等於值1,則執行程式1
;;
"值2")
如果變數的值等於值2,則執行程式2
;;
…省略其他分支…
*)
如果變數的值都不是以上的值,則執行此程式
;;
esac
2)案例
6.3 for迴圈
1)基本語法1:
for 變數 in 值1 值2 值3…
do
程式
done
2)案例:
注意$*和[email protected]的區別!
3)基本語法2:
for (( 初始值;迴圈控制條件;變數變化 ))
do
程式
done
4)案例
6.4 while迴圈
1)基本語法:
while [ 條件判斷式 ]
do
程式
done
2)案例
7 read讀取控制臺輸入
1)基本語法:
read(選項)(引數)
選項:
-p:指定讀取值時的提示符;
-t:指定讀取值時等待的時間(秒)。
引數
變數:指定讀取值的變數名
2)案例
等待三秒後,自動取消
8 函式
8.1 系統函式
1)basename基本語法
basename [pathname] [suffix]
basename [string] [suffix] (功能描述:basename命令會刪掉所有的字首包括最後一個(‘/’)字元,然後將字串顯示出來。
選項:
suffix為字尾,如果suffix被指定了,basename會將pathname或string中的suffix去掉。
3)dirname基本語法
dirname 檔案絕對路徑 (功能描述:從給定的包含絕對路徑的檔名中去除檔名(非目錄的部分),然後返回剩下的路徑(目錄的部分))
8.2 自定義函式
1)基本語法:
[ function ] funname[()] { Action; [return int;] }
function start() / function start / start() |
注意:
(1)必須在呼叫函式地方之前,先宣告函式,shell指令碼是逐行執行。不會像其它語言一樣先編譯。
(2)函式返回值,只能通過$?系統變數獲得,可以顯示加:return返回,如果不加,將以最後一條命令執行結果,作為返回值。return後跟數值n(0-255)
2)案例