1. 程式人生 > >linux學習筆記之shell程式設計

linux學習筆記之shell程式設計

1.什麼是Shell?

  Shell是一個命令列直譯器,它為使用者提供一個向linux核心傳送請求以便執行程式的介面系統級程式,使用者可以用Shell來啟動、掛起、停止甚至編寫一些程式。
  Shell還是一個功能強大的程式語言,易編寫、已除錯、靈活性強。Shell是解釋執行的指令碼語言,在shell中可以呼叫linux系統命令。

2.Shell指令碼的執行方式

 1)echo輸出內容到控制檯
    語法:echo[選項][內容]
    例:echo “helloworld”
 2)指令碼格式
    指令碼是以#!/bin/bash開頭
 3)第一個指令碼

[[email protected]
datas]$ touch helloworld.sh [[email protected] datas]$ vi helloworld.sh 在helloworld.sh中輸入如下內容 #!/bin/bash echo "helloworld"

 4)指令碼的常用執行方式

  • 第一種 輸入指令碼的相對路徑或絕對路徑
    /root/helloWorld.sh 或 ./helloWorld.sh
  • 第二種 sh + 指令碼
    sh /root/helloWorld.sh 或 sh ./helloWorld.sh

3. Shell 中的變數

 1)自定義變數和系統變數

  • 系統變數:$HOME、$PWD、$SHELL、$USER等等
  • 自定義變數:$A 、$B 等等

 2)定義變數

  • 基本語法
    (1)定義變數:變數=值
    (2)撤銷變數:unset 變數
    (3)宣告靜態變數:readonly 變數(注意:不能unset)
  • 變數定義規則
    (1)變數名稱可以由字母、數字和下劃線組成,但是不能以數字開頭。
    (2)等號兩側不能有空格 (一定要注意 !!!)
    (3)變數名稱一般習慣為大寫
    (4)雙引號和單引號有區別,雙引號僅將空格脫意,單引號會將所有特殊字元脫意
     3)位置引數變數
  • 基本語法
$n	(功能描述:n為數字,$0代表命令本身,$1-$9代表第一到第九個引數,
十以上的引數,十以上的引數需要用大括號包含,如${10})
$*	(功能描述:這個變數代表命令列中所有的引數,$*把所有的引數看成
一個整體)
[email protected]
(功能描述:這個變數也代表命令列中所有的引數,不過[email protected]把每個 引數區分對待) $# (功能描述:這個變數代表命令列中所有引數的個數)
  • 案例
    輸出輸入的的引數1,引數2,所有引數,引數個數
#!/bin/bash

echo "$1        $2"

echo "$*"

echo "[email protected]"

echo "$#"

  4)預定義變數

  • 語法
    $$ (功能描述:當前程序的程序號(PID))
    $! (功能描述:後臺執行的最後一個程序的程序號(PID))
    $? (功能描述:最後一次執行的命令的返回狀態。如果這個變數的值為0,證明上一個命令正確執行;如果這個變數的值為非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。)

4.運算子

1)基本語法
$$ (功能描述:當前程序的程序號(PID))
$! (功能描述:後臺執行的最後一個程序的程序號(PID))
$? (功能描述:最後一次執行的命令的返回狀態。如果這個變數的值為0,證明上一個命令正確執行;如果這個變數的值為非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。)
2)案例 計算(2+3)*4

方法一:採用$[運算式]方法
[[email protected] datas]# S=$[(2+3)*4]
[[email protected] datas]# echo $S
方法二:expr分步計算
S=`expr 2 + 3`
expr $S \* 4
方法三:expr一步完成計算
expr `expr 2 + 3` \* 4

5.流程控制

1)if 判斷

  • 基本語法

    if [ 條件判斷式 ];then
    程式
    fi

    if [ 條件判斷式 ]
    then
    程式
    fi

    注意事項:[ 條件判斷式 ],中括號和條件判斷式之間必須有空格

  • 案例
    判斷輸入的數是否等於123,是否等於456

#!/bin/bash

if [ $1 -eq "123" ]
then
        echo "123"
elif [ $1 -eq "456" ]
then
        echo "456"
fi

2)case語句

  • 基本語法
    case $變數名 in
    “值1”)
    如果變數的值等於值1,則執行程式1
    ;;
    “值2”)
    如果變數的值等於值2,則執行程式2
    ;;
    …省略其他分支…
    *)
    如果變數的值都不是以上的值,則執行此程式
    ;;
    esac
  • 案例
    輸入1,輸出1;輸入2,輸出2;輸入其他,輸出other
#!/bin/bash

case $1 in
"1")
        echo "1"
;;

"2")
        echo "2"
;;
*)
        echo "other"
;;
esac

3)for 迴圈

  • 基本語法
for 變數 in 值1 值2 值3… 
  do 
    程式 
  done
或
for (( 初始值;迴圈控制條件;變數變化 )) 
  do 
    程式 
  done
  • 案例
    從1加到100
#!/bin/bash

s=0
for((i=0;i<=100;i++))
do
        s=$[$s+$i]
done
echo "$s"

4)while迴圈

- 基本語法:
	while [ 條件判斷式 ] 
  do 
    程式 
  done
  • 案例
    從1加到100
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
        s=$[$s+$i]
        i=$[$i+1]
done

echo $s

6.read讀取控制檯輸入

  • 基本語法:
    read(選項)(引數)
    選項:
    -p:指定讀取值時的提示符;
    -t:指定讀取值時等待的時間(秒)
    引數
    變數:指定讀取值的變數名
  • 案例
    讀取控制檯輸入的名稱
#!/bin/bash

read -t 7 -p "please 7 miao input your name " NAME

echo $NAME

7.函式

1)系統函式

  • basename基本語法
    basename [pathname] [suffix]
    basename [string] [suffix] (功能描述:basename命令會刪掉所有的字首包括最後一個(‘/’)字元,然後將字串顯示出來。
    選項:
    suffix為字尾,如果suffix被指定了,basename會將pathname或string中的suffix去掉。
  • 案例
    [[email protected] opt]$ basename /opt/test.txt
    test.txt
  • dirname基本語法
    dirname 檔案絕對路徑 (功能描述:從給定的包含絕對路徑的檔名中去除檔名(非目錄的部分),然後返回剩下的路徑(目錄的部分))
  • 案例
    [[email protected] opt]$ dirname /opt/test.txt
    /opt

2)自定義函式

  • 基本語法:
    [ function ] funname[()]
    {
    Action;
    [return int;]
    }

    funname

  • 注意:
    (1)必須在呼叫函式地方之前,先宣告函式,shell指令碼是逐行執行。不會像其它語言一樣先編譯。
    (2)函式返回值,只能通過$?系統變數獲得,可以顯示加:return返回,如果不加,將以最後一條命令執行結果,作為返回值。return後跟數值n(0-255)

  • 案例
    (1)計算輸入引數的和

#!/bin/bash
function sum()
{
    s=0
    s=$[ $1 + $2 ]
    echo "$s"
}

read -p "Please input the number1: " n1;
read -p "Please input the number: " n2;
sum $n1 $n2;