Linux之Shell程式設計
3.Shell程式設計
1.shell是什麼
shell是一個命令列直譯器,它為使用者提供了一個向Linux核心傳送請求以便執行程式的介面系統級程式,使用者可以用shell來啟動、掛起、停止一些程式。
2. shell指令碼的執行方式
-
指令碼格式要求
-
1.指令碼以#!/bin/bash開頭
-
2.指令碼需要可執行許可權
-
-
編寫一個shell指令碼,輸出hello shell
-
mkdir /root/shcode
-
cd /root/shcode
-
vim hello.sh
-
輸入
#!/bin/bash
echo "hello shell "
-
-
指令碼的常用執行方式
-
方式1:(輸入指令碼的絕對路徑或相對路徑)
-
說明:首先要賦予helloshell.sh指令碼的 +x 許可權,
-
再執行指令碼
chmod u+x hello.sh
-
./hello.sh
或者/root/shcode/hello.sh
-
-
方式2:(sh+指令碼)
說明:不用賦予指令碼+x許可權,直接執行即可。
sh hello.sh
-
3.shell的變數
-
shell變數介紹
1.Linux shell 中的變數分為,系統變數和使用者自定義變數。2.系統變數:
$HOME $PWD $SHELL $USER
3.顯示當前shell中所有變數:
set
-
shell變數的定義
-
基本語法
1.定義變數:變數名=值
2.撤銷變數:
unset 變數
3.宣告靜態變數:
readonly 變數
,但是不能unset
-
-
案例
-
案例1:宣告變數A
vim var.sh
#!/bin/bash
A=100
echo "A=$A"
-
案例2:撤銷變數A
unset A
-
案例3:宣告靜態的變數B,不能unset
readonly B
-
-
shell變數的定義
-
定義變數的規則
1.變數名稱可以由字母、數字、和下劃線組成,但是不能以數字開頭。 5A=100 (x)2.等號兩側不能有空格
3.變數名稱一般習慣為大寫,這是一個規範
-
將命令的返回值賦給變數
1.A=date
2.
A=$(date)
等價於反引號
-
4.設定環境變數
-
基本語法
-
export 變數名=變數值
功能描述:將shell變數輸出為環境變數/全域性變數 -
source 配置檔案
功能描述:讓修改後的配置資訊立即生效 -
echo $變數名
功能描述:查詢環境變數的值
-
-
案例
- 在/etc/profile檔案中定義TOMCAT_HOME環境變數
.... - 檢視環境變數TOMCAT_HOME的值
.... - 在另一個shell程式中使用 TOME_HOME
....
- 在/etc/profile檔案中定義TOMCAT_HOME環境變數
-
注意:
在輸出TOMCAT_HOME環境變數前,需要讓其生效
source /etc/profile
-
shell指令碼的註釋
-
shell指令碼單行註釋 採用
#
開頭 -
shell指令碼多行註釋 :
<<! 多行註釋內容 !
-
5.位置引數變數
當我們執行一個shell指令碼時,如果希望獲取到命令列的引數資訊,就可以使用到位置引數變數。
比如: ./myshell.sh 100 200
這就是一個執行shell的命令列,就可以在myshell指令碼中獲取到引數資訊
-
基本語法
1.$n
功能描述:n為數字,$0
代表命令本身,$1-$9
代表第一到第九個引數,十以上的引數需要使用大括號包含,如${10}
2.
$*
功能描述:這個變數代表命令列中的所有引數 ,此命令把所有引數看成一個整體3.
$@
功能描述:這個變數也代表命令列中的所有的引數,但是此命令把每個引數區分對待4.
$#
功能描述:這個變數代表命令列中的所有引數的個數 -
位置引數變數
- 案例:編寫一個shell指令碼position.sh,在指令碼中獲取到命令列的各個引數資訊
-
#!/bin/bash
-
echo "0=$0 1=$1 2=$2"
-
echo "所有的引數=$*"
-
echo "$@"
-
echo "引數的個數=$#"
-
執行
sh position.sh 100 200
-
輸出結果
- 0=./position.sh 1=100 2=200
- 所有的引數=100 200
- 100 200
- 引數的個數=2
-
- 案例:編寫一個shell指令碼position.sh,在指令碼中獲取到命令列的各個引數資訊
6.預定義變數
就是shell指令碼設計者事先已經定義好的變數,可以直接在shell指令碼中使用
-
基本語法
-
$$
功能描述:當前程序的程序號(PID) -
$!
功能描述:後天執行的最後一個程序的程序號(PID) -
$?
功能描述:最後一次執行的命令的返回狀態。如果這個變數的值為0,證明上一個命令正確執行;如果這個變數的值非0(具體的數字由命令本身來決定),則證明上一條命令執行不正確。
-
-
應用案例
在一個shell指令碼中簡單使用預定義變數
prevar.sh
7.運算子
-
基本語法
-
"$((運算式))"
或"$[運算式]"
推薦使用 或者expr m + n
-
注意
expr
運算子間要有空格 -
expr m-n
-
expr \*, / , %
乘,除,取餘
-
-
應用例項
-
案例1:計算(2+3)*4
1.$(((2+3)*4))
2.
$[(2+3)*4]
3.
TEMP=
expr (2 + 3)`4.
RES=
expr TEMP * 4`` -
案例2:求出命令列的兩個引數[整數]的和
-
vim oper.sh
-
#!/bin/bash
-
SUM=$[$1+$2]
-
echo "sum=$SUM"
-
./oper.sh 20 50
-
-
8.條件判斷
-
判斷語句
-
基本語法
[ condition ]
注意condition前後要有空格非空返回
true
,可使用$?
驗證(0為true
,>1為false
)
-
-
應用例項
[] true
[] false
[ condition ] && echo OK || echo notok
條件滿足,執行後邊語句 -
常用判斷條件
-
=
字串比較 -
兩個整數的比較
-lt
小於-le
小於等於 little equal-eq
等於-gt
大於-ge
大於等於-ne
不等於 -
按照檔案許可權進行判斷
-r
有讀的許可權-w
有寫的許可權-x
有執行的許可權 -
按照檔案型別進行判斷
-f
檔案存在並且是一個常規的檔案-e
檔案存在-d
檔案存在且是一個目錄
-
-
使用案例
-
案例1: 判斷"ok" 是否等"ok"
判斷語句
=
-
案例2: 23是否大於等於22
判斷語句
-ge
-
案例3: /root/shcode/aaa.txt目錄中的檔案是否存在
判斷語句
-f
-
9.流程控制
-
if判斷
- 基本語法
-
if [條件判斷式] then 程式碼 fi
-
if [條件判斷表示式] then 程式碼 elseif [條件判斷表示式] 程式碼 fi
-
[ 條件判斷式 ] ,中括號和條件判斷式之間必須有空格
-
- 基本語法
-
應用例項 ifcase.sh
編寫shell程式,如果輸入的引數大於等於60,輸出及格了,如果輸入小於60,輸出不及格。#!/bin/bash
if [ $1 -ge 60 ]
then
echo "及格"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
-
case語句
- 基本語法
-
case $變數名 in "1")
如果變數的值等於值1,則執行程式1
-
;; "2")
如果變數的值等於值2,則執行程式2
-
;; "* ")
如果變數的值都不是以上的值,則執行此程式
-
;; esac
-
- 基本語法
-
應用案例
當命令列引數是1時,輸出週一,當是2時,輸出週二,其他情況輸出other
#!/bin/bash
case $1 in
"1")
echo "週一"
;;
"2")
echo "週二"
;;
*)
echo "other"
;;
esac
-
for 迴圈
-
基本語法1
for 變數 in 值1 值2 值3 ... do 程式/程式碼 done
-
基本語法2
for ((初始值;迴圈控制條件;變數變化)) do 程式 done
-
-
while迴圈
-
基本語法1
while [ 條件判斷式 ] do 程式 done
-
10.read讀取控制檯輸入
-
基本語法
read(選項)(引數)
-
選項
-p
功能:指定讀取值時的提示符;-t
功能:指定讀取值時等待的時間(秒),如果沒有在指定的時間輸入,就不再等待了。 -
引數
變數: 指定讀取值的變數名
-
-
應用例項 testRead.sh
案例1:讀取控制檯輸入一個num值
案例2:讀取控制檯輸入一個num值,在10秒內輸入
#!/bin/bash
read -p "請輸入一個數NUM1=" NUM1
echo "你輸入的數NUM1=$NUM1"
read -t 10 -p "請輸入一個數NUM2=" NUM2
echo "你輸入的數NUM2=$NUM2"
11. 函式
shell程式設計和其他程式語言一樣,有系統函式,也可以自定義函式。
-
系統函式
-
basename基本語法 功能:返回完整路徑最後/的部分,常用於獲取檔名
basename pathname suffix
basename string suffix
功能描述:basename命令會刪掉所有的字首包括最後一個'/'
字元,然後將字串顯示出來。選項:
suffix
為字尾,如果指定了suffix,basename會將pathname或string中的suffix去掉
-
-
應用例項
請返回/home/aaa/test.txt的test.txt的部分指令:
basename /home/aaa/test.txt
執行結果: test.txtbasename /home/aaa/test.txt .txt
執行結果:
test
-
dirname基本語法
功能:返回完整路徑最後/的前面的部分,常用於返回路徑部分dirname 檔案絕對路徑
功能描述:從給定的包含絕對路徑的檔名中去除檔名(非目錄的部分),然後返回剩下的路徑(目錄的部分)應用案例
案例1:請返回/home/aaa/test.txt的/home/aaa指令:
dirname /home/aaa/test.txt
-
自定義函式
-
基本語法
[function] funname[()] { action; [return int;] }
-
呼叫直接寫函式名 funname [值]
-
應用例項
1. 計算輸入兩個引數的和,getSum#!/bin/bash
#計算輸入兩個引數的和,getSum
# 定義函式getSum
function getSum()
{
SUM=$[ $n1+$n2 ]
echo "和是=$SUM"
}
#輸入兩個值
read -p "請輸入一個值n1=" n1
read -p "請輸入一個值n2=" n2
-