Shell編程 - 黑猴子

一、概述

Shell是一個命令行解釋器,它爲用戶提供了一個向Linux內核發送請求以便運行程序的界面系統級程序,用戶能夠用Shell來啓動、掛起、中止甚至是編寫一些程序。shell

Shell仍是一個功能至關強大的編程語言,易編寫、易調試、靈活性強。Shell是解釋執行的腳本語言,在Shell中能夠調用Linux系統命令。編程

 

二、shell腳本的執行方式

1)echo輸出內容到控制檯bash

       (1)基本語法:編程語言

              echo [選項] [輸出內容]函數

選項:oop

  -e:  支持反斜線控制的字符轉換spa

控制字符 命令行

做        用調試

\\ 進程

輸出\自己

\a 

輸出警告音

\b 

退格鍵,也就是向左刪除鍵

\c 

取消輸出行末的換行符。和「-n」選項一致

\e 

ESCAPE鍵

\f 

換頁符

\n 

換行符

\r 

回車鍵

\t 

製表符,也就是Tab鍵

\v 

垂直製表符

\0nnn

按照八進制ASCII碼錶輸出字符。其中0爲數字零,nnn是三位八進制數

\xhh

按照十六進制ASCII碼錶輸出字符。其中hh是兩位十六進制數

       (2)案例

              [wyh@hadoop101 sbin]$ echo "helloworld"

              helloworld

2)腳本格式

     (1)腳本以  #!/bin/bash   開頭

     (2)腳本必須有可執行權限

3)第一個Shell腳本

     (1)需求:建立一個Shell腳本,輸出helloworld

     (2)實操:

[wyh@hadoop101 datas]$ touch helloworld.sh

[wyh@hadoop101 datas]$ vi helloworld.sh

 

在helloworld.sh中輸入以下內容

#!/bin/bash  

echo "helloworld"

 

4)腳本的經常使用執行方式

     第一種:輸入腳本的絕對路徑或相對路徑

    (1)首先要賦予helloworld.sh 腳本的+x權限

     [wyh@hadoop101 datas]$ chmod 777 helloworld.sh

    (2)執行腳本

       /root/helloWorld.sh

       ./helloWorld.sh

       第二種:bash或sh+腳本(不用賦予腳本+x權限)

       sh /root/helloWorld.sh

       sh helloWorld.sh

 

三、shell中的變量

1)Linux Shell中的變量分爲,系統變量和用戶自定義變量。

2)系統變量:$HOME、$PWD、$SHELL、$USER等等

3)顯示當前shell中全部變量:set

 

四、 定義變量

1)基本語法:

       (1)定義變量:變量=值

       (2)撤銷變量:unset 變量

       (3)聲明靜態變量:readonly變量,注意:不能unset

2)變量定義規則

       (1)變量名稱能夠由字母、數字和下劃線組成,可是不能以數字開頭。

       (2)等號兩側不能有空格

       (3)變量名稱通常習慣爲大寫

3)案例

       (1)定義變量A

              A=8              

       (2)撤銷變量A

              unset A      

       (3)聲明靜態的變量B=2,不能unset

              readonly B=2 

       (4)可把變量提高爲全局環境變量,可供其餘shell程序使用

              export 變量名  

 

五、 將命令的返回值賦給變量

       (1)A=`ls -la` 反引號,運行裏面的命令,並把結果返回給變量A

       (2)A=$(ls -la) 等價於反引號

 

六、設置環境變量

1)基本語法:

       (1)export 變量名=變量值     (功能描述:設置環境變量的值)

       (2)source 配置文件                     (功能描述:讓修改後的配置信息當即生效)

       (3)echo $變量名                   (功能描述:查詢環境變量的值)

2)案例:

       (1)在/etc/profile文件中定義JAVA_HOME環境變量

              export JAVA_HOME=/opt/module/jdk1.7.0_79

              export PATH=$PATH:$JAVA_HOME/bin

 

       (2)查看環境變量JAVA_HOME的值

             [wyh@hadoop101 datas]$ echo $JAVA_HOME

            /opt/module/jdk1.7.0_79

 

七、 位置參數變量

1)基本語法

       $n   (功能描述:n爲數字,$0表明命令自己,$1-$9表明第一到第九個參數,十以上的參數,十以上的參數須要用大括號包含,如${10})

       $*   (功能描述:這個變量表明命令行中全部的參數,$*把全部的參數當作一個總體)

       $@  (功能描述:這個變量也表明命令行中全部的參數,不過$@把每一個參數區分對待)

       $#   (功能描述:這個變量表明命令行中全部參數的個數)

2)案例

       (1)輸出輸入的的參數1,參數2,全部參數,參數個數

#!/bin/bash

echo "$0  $1   $2"

echo "$*"

echo "$@"

echo "$#"

       (2)$*與$@的區別

#!/bin/bash

for i in "$*"

#$*中的全部參數當作是一個總體,因此這個for循環只會循環一次

        do

                echo "The parameters is: $i"

        done

x=1

for y in "$@"

#$@中的每一個參數都當作是獨立的,因此「$@」中有幾個參數,就會循環幾回

        do

                echo "The parameter$x is: $y"

                x=$(( $x +1 ))

        done

a)$*和$@都表示傳遞給函數或腳本的全部參數,不被雙引號「」包含時,都以$1 $2 …$n的形式輸出全部參數

b)當它們被雙引號「」包含時,「$*」會將全部的參數做爲一個總體,以「$1 $2 …$n」的形式輸出全部參數;「$@」會將各個參數分開,以「$1」 「$2」…」$n」的形式輸出全部參數

 

八、 預約義變量

1)基本語法:

       $?         (功能描述:最後一次執行的命令的返回狀態。若是這個變量的值爲0,證實上一個命令正確執行;若是這個變量的值爲非0(具體是哪一個數,由命令本身來決定),則證實上一個命令執行不正確了。)

$$          (功能描述:當前進程的進程號(PID))

$!           (功能描述:後臺運行的最後一個進程的進程號(PID))

2)案例

#!/bin/bash

echo "$$"

./helloworld.sh &

echo "$!"

echo "$?"

 

九、運算符

1)基本語法:

       (1)「$((運算式))」或「$[運算式]」

       (2)expr m + n

注意expr運算符間要有空格

       (3)expr m - n

       (4)expr  \*, /, %    乘,除,取餘

2)案例:計算(2+3)X4的值

       (1)採用$[運算式]方式

               [root@hadoop101 datas]# S=$[(2+3)*4]

              [root@hadoop101 datas]# echo $S

       (2)expr分佈計算

              S=`expr 2 + 3`

              expr $S \* 4

       (3)expr一步完成計算

              expr `expr 2 + 3` \* 4

 

十、判斷語句

1)基本語法:

[ condition ](注意condition先後要有空格)

#非空返回true,可以使用$?驗證(0爲true,>1爲false)

 

2)案例

[wyh]      返回true

[]                  返回false

[condition] && echo OK || echo notok                   條件知足,執行後面的語句

 

十一、經常使用判斷條件

1)兩個整數之間比較

       = 字符串比較

       -lt 小於

       -le 小於等於

       -eq 等於

       -gt 大於

       -ge 大於等於

       -ne 不等於

 

2)按照文件權限進行判斷

       -r 有讀的權限

       -w 有寫的權限

       -x 有執行的權限

 

3)按照文件類型進行判斷

       -f 文件存在而且是一個常規的文件

       -e 文件存在

       -d 文件存在並是一個目錄

 

4)案例

       (1)23是否大於等於22

              [ 23 -ge 22 ]

       (2)student.txt是否具備寫權限

              [ -w student.txt ]

       (3)/root/install.log目錄中的文件是否存在

              [ -e /root/install.log ]

 

十二、if判斷

1)基本語法:

if [ 條件判斷式 ];then

  程序

fi

或者

if [ 條件判斷式 ]

  then

    程序

fi

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

 

2)案例

#!/bin/bash

 

if [ $1 -eq "123" ]

then

        echo "123"

elif [ $1 -eq "456" ]

then

        echo "456"

fi

 

1三、case語句

1)基本語法:

case $變量名 in

  "值1")

    若是變量的值等於值1,則執行程序1

    ;;

  "值2")

    若是變量的值等於值2,則執行程序2

    ;;

  …省略其餘分支…

  *)

    若是變量的值都不是以上的值,則執行此程序

    ;;

esac

2)案例

!/bin/bash

 

case $1 in

"1")

        echo "1"

;;

 

"2")

        echo "2"

;;

*)

        echo "other"

;;

esac

 

1四、for循環

1)基本語法1:

for 變量 in 值1 值2 值3…

  do

    程序

  done

2)案例:

       (1)打印輸入參數

#!/bin/bash

#打印數字

 

for i in "$*"

    do

      echo "The num is $i "

    done

 

for j in "$@"

        do

        echo "The num is $j"

        done

3)基本語法2:

       for (( 初始值;循環控制條件;變量變化 ))

  do

    程序

  done

4)案例

(1)從1加到100

#!/bin/bash

 

s=0

for((i=0;i<=100;i++))

do

        s=$[$s+$i]

done

echo "$s"

 

1五、while循環

1)基本語法:

while [ 條件判斷式 ]

  do

    程序

  done

2)案例

       (1)從1加到100

#!/bin/bash

s=0

i=1

while [ $i -le 100 ]

do

        s=$[$s+$i]

        i=$[$i+1]

done

 

echo $s

 

1六、read讀取控制檯輸入

1)基本語法:

       read(選項)(參數)

       選項:

-p:指定讀取值時的提示符;

-t:指定讀取值時等待的時間(秒)。

參數      

       變量:指定讀取值的變量名

2)案例

       讀取控制檯輸入的名稱

#!/bin/bash

 

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

 

echo $NAME

 

1七、系統函數

1)basename基本語法

       basename [pathname] [suffix]          

       basename [string] [suffix]         (功能描述:basename命令會刪掉全部的前綴包括最後一個(‘/’)字符,而後將字符串顯示出來。

       選項:

       suffix爲後綴,若是suffix被指定了,basename會將pathname或string中的suffix去掉。

2)案例

       [wyh@hadoop101 opt]$ basename /opt/test.txt

       test.txt

       [wyh@hadoop101 opt]$ basename /opt/test.txt .txt

       test

3)dirname基本語法

       dirname 文件絕對路徑             (功能描述:從給定的包含絕對路徑的文件名中去除文件名(非目錄的部分),而後返回剩下的路徑(目錄的部分))

4)案例

       [wyh@hadoop101 opt]$ dirname /opt/test.txt

       /opt

 

1八、自定義函數

1)基本語法:

[ function ] funname[()]

{

       Action;

       [return int;]

}

      

funname

注意:

       (1)必須在調用函數地方以前,先聲明函數,shell腳本是逐行運行。不會像其它語言同樣先編譯。

       (2)函數返回值,只能經過$?系統變量得到,能夠顯示加:return返回,若是不加,將以最後一條命令運行結果,做爲返回值。return後跟數值n(0-255)

2)案例

       (1)計算輸入參數的和

#!/bin/bash

function sum()

{

    s=0

    s=$[ $1 + $2 ]

    echo "$s"

}

 

read -p "Please input the number1: " n1;

read -p "Please input the number2: " n2;

sum $n1 $n2;

相關文章
相關標籤/搜索