Shell 是一個命令行解釋器,它爲用戶提供了一個向 Linux 內核發送請求以便運行程序的界面系統級程序,用戶可以用 Shell 來啓動、掛起、停止甚至是編寫一些程序。
1.shell腳本格式要求
1. 腳本以#!/bin/bash 開頭
2. 腳本需要有可執行權限
2 Shell的變量
1. Shell 中的變量分爲系統變量和用戶自定義變量。 2. 系統變量:$HOME、$PWD、$SHELL、$USER 等等,比如: echo $HOME 等等.. 3. 顯示當前 shell 中所有變量:set
2.1 shell 變量的定義
1. 定義變量:變量名=值 2.撤銷變量:unset 變量 3. 聲明靜態變量:readonly 變量,注意:不能 unset
定義變量的規則
1.變量名稱可以由字母、數字和下劃線組成,但是不能以數字開頭。5A=200(×) 2. 等號兩側不能有空格 3. 變量名稱一般習慣爲大寫, 這是一個規範
將命令的返回值賦給變量
1. A=`date`反引號,運行裏面的命令,並把結果返回給變量 A
2. A=$(date) 等價於反引號
3 設置環境變量
1. export 變量名=變量值 (將 shell 變量輸出爲環境變量/全局變量) 2. source 配置文件(讓修改後的配置信息立即生效) 3. echo $變量名(查詢環境變量的值)
shell 腳本的多行註釋
:<<!
xxxxxx
xxxxxx
!
4 位置參數變量
當我們執行一個 shell 腳本時,如果希望獲取到命令行的參數信息,就可以使用到位置參數變量. 比如 : ./add.sh 100 200 , 這個就是一個執行 shell 的命令行,可以在 add腳本中獲取到參數信息
$n (n 爲數字,$0 代表命令本身,$1-$9 代表第一到第九個參數,十以上的參數,十以上的參數需要用大括號包含,如${10}) $* (代表命令行中所有的參數,$*把所有的參數看成一個整體) $@ (代表命令行中所有的參數,不過$@把每個參數區分對待) $# (代表命令行中所有參數的個數)
5 預定義變量
就是 shell 設計者事先已經定義好的變量,可以直接在 shell 腳本中使用
1. $$ (當前進程的進程號(PID)) 2. $! (後臺運行的最後一個進程的進程號(PID)) 3. $?(最後一次執行的命令的返回狀態。如果這個變量的值爲 0,證明上一個命令正確執行;
如果這個變量的值爲非 0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。)
在一個 shell 腳本中簡單使用一下預定義變量
#!/bin/bash echo "當前執行的進程 id=$$" #以後臺的方式運行一個腳本,並獲取他的進程號 /home/brian/show.sh & echo "最後一個後臺方式運行的進程 id=$!" echo "執行的結果是=$?"
6 運算符
1. “$((運算式))” 或 “$[運算式] ” 或者 expr m + n 2. 注意 expr 運算符間要有空格, 如果希望將exp 的結果賦給某個變量,使用 `` 3. expr m - n 4. expr \*, /, % 乘,除,取餘
應用實例
#!/bin/bash
#案例 1:計算(2+3)X4 的值 #使用第一種方式 RES1=$(((2+3)*4)) echo "res1=$RES1" #使用第二種方式, 推薦使用 RES2=$[(2+3)*4] echo "res2=$RES2" #使用第三種方式 expr TEMP=`expr 2 + 3` RES4=`expr $TEMP \* 4` echo "temp=$TEMP" echo "res4=$RES4" #案例 2:請求出命令行的兩個參數[整數]的和 6 7 SUM=$[$1+$2] echo "sum=$SUM"
7 條件判斷
[ condition ](注意 condition 前後要有空格) #非空返回 true,可使用$?驗證(0 爲 true,>1 爲 false)
[ condition ] && echo “OK” || echo “ERROR” 條件滿足,執行後面的語句
常用判斷條件
1. = 字符串比較 2. 整數的比較 -lt 小於 -le 小於等於 -eq 等於 -gt 大於 -ge 大於等於 -ne 不等於 3. 按文件權限進行判斷 -r 有讀的權限 -w 有寫的權限 -x 有執行的權限 4. 按文件類型進行判斷 -f 文件存在並且是一個常規的文件 -e 文件存在 -d 文件存在並是一個目錄
8 流程控制
8.1 if 判斷
if [ 條件判斷式 ] then 代碼 fi
多分支判斷
if [ 條件判斷式 ] then 代碼 elif [條件判斷式] then 代碼 fi
注意:[ 條件判斷式 ] 括號和條件判斷式之間必須有空格
8.2 case語句
case $變量名 in "值 1") 如果變量的值等於值 1,則執行程序 1 ;; "值 2") 如果變量的值等於值 2,則執行程序 2 ;; …省略其他分支… *) 如果變量的值都不是以上的值,則執行此程序 ;; esac
8.3 for循環
for 變量 in 值 1 值 2 值 3… do 程序/代碼 done
基本語法2
for (( 初始值;循環控制條件;變量變化 )) do 程序/代碼 done
8.4 while循環
while [ 條件判斷式 ] do 程序 /代碼 done
注意:while 和 [有空格,條件判斷式和 [也有空格
9 read讀取控制檯輸入
read(選項)(參數) -p:指定讀取值時的提示符; -t:指定讀取值時等待的時間(秒),如果沒有在指定的時間內輸入,就不再等待
應用實例
#!/bin/bash #案例 1:讀取控制檯輸入一個 N1 值 read -p "請輸入一個數 N1=" N1 echo "你輸入的 N1=$N1" #案例 2:讀取控制檯輸入一個 N2 值,在5秒內輸入。 read -t 5 -p "請輸入一個數 N2=" N2 echo "你輸入的 N2=$N2"
10 函數
shell 編程和其它編程語言一樣,有系統函數,也可以自定義函數。
10.1 系統函數
系統函數中,我們這裏就介紹兩個。
basename :返回完整路徑最後 / 的部分,常用於獲取文件名
basename [pathname] [suffix]
basename [string] [suffix]
suffix 爲後綴,如果 suffix 被指定了,basename 會將 pathname 或 string 中的 suffix 去掉。
dirname 返回完整路徑最後 / 的前面的部分,常用於返回路徑部分
dirname 文件絕對路徑
10.2 自定義函數
[ function ] funname[()] { Action; [return int;] }
調用直接寫函數名:funname [值]
應用實例
#!/bin/bash #案例:計算輸入兩個參數的和(動態的獲取), getSum #定義函數 getSum function getSum() { SUM=$[$n1+$n2] echo "和是=$SUM" } #輸入兩個值 read -p "請輸入一個數 n1=" n1 read -p "請輸入一個數 n2=" n2 #調用自定義函數 getSum $n1 $n2