1. 程式人生 > 其它 >linux shell快速入門

linux shell快速入門

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 值 3do
    程式/程式碼
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