shell基礎下

第1章 shell基礎下linux

1.1read基礎命令shell

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

常見語法格式windows

read[參數] [變量名]bash

1.1.1-p

-p=prompt:設置提示信息運維

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

請輸入兩個數字1 2函數

[root@CC ~]# echo $V1 $V2linux運維

1 2ui

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. 最關鍵的是語法熟練、編碼習慣、編程思想,將錯誤扼殺在萌芽之中,減輕負擔,提升效率。

相關文章
相關標籤/搜索