shell基礎下

第1章 shell基礎下

1.1read基礎命令

shell變量除了可以直接賦值或腳本傳參外,還可以使用read命令從標準輸入中獲得,read爲bash內置命令。

常見語法格式

read[參數] [變量名]

1.1.1-p

-p=prompt:設置提示信息

[root@CC ~]# read -p "請輸入兩個數字" V1 V2

請輸入兩個數字1 2

[root@CC ~]# echo $V1 $V2

1 2

1.1.2-t

設置輸入等待時間,單位默認爲秒

[root@CC ~]# read -p "請輸入兩個數字" -t 5

請輸入兩個數字[root@CC ~]#

1.1.3-n計數

read -n個數,設置read命令計數輸入的字符,當輸入的字符數目達到預定數目時自動退出,並將輸入的數據賦值給變量。

[root@CC ~]# read -p "請輸入兩個數字"  -n 5 -t 10 a b c

請輸入兩個數字1 2 3[root@CC ~]# echo $a

1

[root@CC ~]# echo $b

2

[root@CC ~]# echo $a $b $c

1 2 3

案例:實現read 基本讀入功能

[root@CC scripts]# read -t 10 -p "輸入一個數字:" num

輸入一個數字:12

[root@CC scripts]# echo $num

12

1.2if 條件語句

對於if條件語句,簡單地說,其語義類似於漢語裏的“如果。。那麼。。”。if條件語句是linux運維人員必掌握的知識!

1.2.1if條件語句的語法

  1. 單分支結構:

第一種語法:

if <條件表達式>

then

指令

fi

第二種語法:

if <條件表達式>;then

指令

fi

上文的“<條件表達式>"部分可以是test,[],[[]],(())等條件表達式,甚至可以直接使用命令作爲條件表達式。每個if條件語句都以if開頭,並且帶有then,最後以fi結束。

第二種語法中的分號相當於命令換行,上面的兩種語法含義是相同的。

條件語句還可以嵌套(即if條件句裏面還有if條件句),注意每個if條件句中都要有一個與之對應的fi,每個if和它下面最近的fi成對搭配,語法如下表示:

if <條件表達式>

then

if <條件表達式>

then

fi

fi

特殊用法:

文件條件表達式[-f "$file1"]&&echo 1就等價於下面的if條件語句。

if [ -f  "$file1"];then

echo 1

fi

記憶方法:

爲了便於大家記憶if單分支語句的語法,老男孩給出了形象的語法描述。if條件語句單分支的中文編程就相當於一個女孩對你說:

如果<你有房>

那麼

我就嫁給你

果如

案例1 比較兩個數字的大小

read -p "請輸入兩個字:" x y

#no.1 判斷是否爲兩個數字

[ -z "$x" -o -z"$y" ] &&\

echo "錯誤:輸入兩個整數"  &&\

exit 1

#no.2 判斷是數字

if [   -z  "`echo $x|sed 's#[0-9]##g'` " -a   -z " `echo $y|sed's#[0-9]##g'` " ]

then 

echo " 錯誤:請輸入整數 "

exit 2

fi

exit 2

fi

#no.3 比較數字大小

if [ $x -gt $y ]

then 

    echo "$x > $y"

    

else

 if [ $x -lt $y ]

 then

    echo "$x<$y"

else

 

   echo "$x=$y"

fi

檢查輸出結果

[root@CC tmp]# sh 比較.sh

請輸入兩個字:2 1

2 > 1

[root@CC tmp]# sh 比較.sh

請輸入兩個字:1 1

1=1

[root@CC tmp]# sh 比較.sh

請輸入兩個字:1 2

1<2

1.2.2 雙分支結構

if 條件語句的單分支結構主體就是“如果.....,那麼.......",而if條件語句的雙分支結構則爲”如果....,那麼.....,否則,........."

if條件語句的雙分支結構語法爲:

if<條件表達式>

then

  指令集1

else

  指令集2

fi

例:

if [ $x -eq $y ]

then

    echo"$x = $y"

else

    echo"$x < $y"

fi

1.2.3多分支語句

if條件語句多分支的主體爲“如果.....,那麼.....,否則如果........,那麼,否則如果........,那麼....,否則...."

if條件語句多分支:

if  <條件表達式1>

then

   指定2

else

   指定3

fi

提示:

  1. 多分支elif 的寫法,每個elif都要帶有then.

  2. 注意結尾的else後面沒有then

fi

#no.3 比較數字大小

if [ $x -gt $y ]

then 

    echo"$x > $y"

    

else

 if [ $x -lt$y ]

 then

    echo"$x<$y"

else

 

   echo"$x=$y"

fi

 

fi

1.3case

case條件語句相當於分支的if/elif/else 條件語句,但是它比這些條件語句看起來更規範更工整,常被應用於實現系統服務啓動腳本等企業應用場景中。

1.3.1case條件語句的語法

case條件語句的語法格式爲:

case "常量” in

值1)

指令1..

;;

值 2)

指令2..

;;

*)

指令 3..

esec

說明:當變量的值等於值1,執行指令1;等於值2時執行指令2,以此類推;如果都不符合,則執行“*)”後面的指令,即指令3.此外,注意不同行內容的縮進距離。

 

case 語句小結

  1. 語句就相當於多分支的if語句,case 語句的優勢是更規範,易讀。

  2. 語句適合變量的值少,且爲固定的數字或字符串。{1,2,3}或{start,stop,restart}

  3. 系統服務啓動腳本傳參的判斷多用case語句,多參考rpcbind/nfs/crond腳本

echo -e "\033[30m 黑色字cc trainning \033[0m"

echo -e "\033[31m 紅色字cc trainning \033[0m"

echo -e "\033[32m 綠色字cc trainning \033[0m"

echo -e "\033[33m 黃色字cc trainning \033[0m"

echo -e "\033[34m 藍色字cc trainning \033[0m"

echo -e "\033[35m 紫色字cc trainning \033[0m"

echo -e "\033[36m 天藍字cc trainning \033[0m"

echo -e "\033[37m 白色字cc trainning \033[0m"

echo -e "\033[40;37m 黑底白字 welcome to cc1\033[0m"

echo -e "\033[41;37m 紅底白字 welcome to cc2\033[0m"

echo -e "\033[42;37m 綠底白字 welcome to cc3\033[0m"

echo -e "\033[43;37m 黃底白字 welcome to cc4\033[0m"

echo -e "\033[44;37m 藍底白字 welcome to cc5\033[0m"

echo -e "\033[45;37m 紫底白字 welcome to cc6\033[0m"

echo -e "\033[46;37m 天藍白字 welcome to cc7\033[0m"

echo -e "\033[47;30m 白底黑字 welcome to cc8\033[0m"

使用時直接複製粘貼即可

實例應用

echo " Usage : $0 content{red|green|blue|yellow}"

fi 

       

case "$2" in

   red|RED|Red)

        echo-e "\033[31m $1 \033[0m"

        ;;

   green|GREEN)

        echo-e "\033[32m $1 \033[0m"

        ;;

    blue)

        echo-e "\033[34m $1 \033[0m"

        ;;

    yellow)

        echo-e "\033[33m $1 \033[0m"

        ;;

    *)

        echo"Usage:$0 content {red|green|blue|yellow}"

esac

1.5循環語句(while/for)

1.5.1循環語句語法

while 條件句

while 條件

do

  指令

done

1.5.2for 循環結構語法

for 變量名 in 變量取值列表

  do

指令...

done

 

 

 

打印列表元素

for n in {1..5}

do

echo $n

done

[root@CC scripts]# sh for1.sh

1

2

3

4

5

1.5.3while

 while條件句

while 條件

do

   指令

done

 

#!/bin/sh

while ture

  do

uptime

sleep 2

done    #死循環

實例:守護進程問題

while true

do

 uptime    echo -e "\033[31m  date+%F \033[0m"

 usleep100000

 done     

 

1.6防止腳本執行中斷的方法

  1. 分離ctrl+a+d 查看screen -ls進入screen -r num

  2. 循環的特長是執行守護進程以及我們希望循環不退出持續執行,用於頻率小於1分鐘循環處理(crond),其他的while循環幾乎都可以被for循環替代。

  3. 語句可以被if語句替換,一般在系統啓動腳本傳入少量固定規則字符串用case語句。其他普通判斷多用if。

  4. 一句話,if ,for語句最常用,其次while(守護進程),case(服務啓動腳本)。

  5. 通過系統環境變量$RANDOM

[root@cc34-moban ~]# echo $((RANDOM%9))   #輸出0~9之間的隨機數

4

 [root@cc34-moban~]# echo $((RANDOM%9))$((RANDOM%9))  #輸出00~99之間的隨機數

51

[root@cc34-moban ~]# echo $RANDOM|md5sum   #隨機數長短不一,可以用md5sum命令統一格式化

19121aca287a586799549aa689c8e526  -

between 0 and32767

多種取隨機數方法組合起來密碼更隨機

 

  1. 通過openssl產生

  2. 通過時間獲取隨機數

echo $(date +%N

uuid碼有硬件,時間,機器當前運行信息等組成,理論上在互聯網中是唯一的。

[root@cc34-moban ~]# uuidgen

5fc2a0b4-4ddf-4663-9022-ce3647ba8533

1.9break continue exit return

1.9.1break continue exit對比

命令

說明

break n   

n表示跳出循環的層數,如果省略n表示跳出整個循環。

continue n

n表示退出到第n層繼續循環,如果省略n表示跳過本次循環,忽略本次循環的剩餘代碼,進入循環的卜次循環

exit n

退出當前shell程序,n爲返回值,n也可以省略,在下一個shell

裏通過$?接收這個n的值。

return n

用在函數裏,作爲函數的返回值,用於判斷函數執行是否正確

和exit一樣,如果函數裏有循環,也會直接退出循環,退出函數。

break跳出整個循環,繼續循環外後而的程序執行。

continue結束本次循環,繼續下一次循環。

exit退出核個腳本

 

第2章 shell腳本的調試

2.1shell腳本調試技巧

調試技巧1:使用dos2unix處理腳本

從windows編輯的腳本到Linux下需要使用這個命令。

dos2unix windows.sh

 

調試技巧2:使用echo命令調試

在變量讀取或修改的前後加入echo$變量。也可在後面使用exit退出腳本這樣可以不用註釋後面的代碼。

 

調試技巧3:利用bash的參數調試

sh [-nvx]

-n:不會執行該腳本,僅查詢腳本語法是否有問題,並給出錯誤提示。可用於生產服務哪些只執行一次不可逆的腳本。

-v:在執行腳本時,先將腳本的內容輸出到屏幕上然後執行腳本,如果有錯誤,也會給出錯誤提示。(不用)

-x:將執行的腳本內容及輸出顯示到屏幕上,常用。

2.2shell調試技巧小結

  1. 要記得首先用dos2unix對腳本格式化。

  2. 直接執行腳本根據報錯來調試,有時報錯不準確。

  3. 調試整個腳本,顯示執行過程。

  4. 和set +x調試部分腳本(在腳本中設置)

  5. 輸出變量及相關內容,然後緊跟着exit退出,不執行後面程序的方式,一步步跟蹤腳本,對於邏輯錯誤比較好用。

     寫法:echo $var;exit

  1. 最關鍵的是語法熟練、編碼習慣、編程思想,將錯誤扼殺在萌芽之中,減輕負擔,提高效率。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章