1. 程式人生 > >Linux基礎之Shell程式設計

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)案例