第1章 shell基礎下linux
1.1read基礎命令shell
shell變量除了能夠直接賦值或腳本傳參外,還可使用read命令從標準輸入中得到,read爲bash內置命令。編程
常見語法格式windows
read[參數] [變量名]bash
-p=prompt:設置提示信息運維
[root@CC ~]# read -p "請輸入兩個數字" V1 V2ide
請輸入兩個數字1 2函數
[root@CC ~]# echo $V1 $V2linux運維
1 2ui
設置輸入等待時間,單位默認爲秒
[root@CC ~]# read -p "請輸入兩個數字" -t 5
請輸入兩個數字[root@CC ~]#
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
對於if條件語句,簡單地說,其語義相似於漢語裏的「若是。。那麼。。」。if條件語句是linux運維人員必掌握的知識!
單分支結構:
第一種語法:
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
if 條件語句的單分支結構主體就是「若是.....,那麼.......",而if條件語句的雙分支結構則爲」若是....,那麼.....,不然,........."
if條件語句的雙分支結構語法爲:
if<條件表達式>
then
指令集1
else
指令集2
fi
例:
if [ $x -eq $y ]
then
echo"$x = $y"
else
echo"$x < $y"
fi
if條件語句多分支的主體爲「若是.....,那麼.....,不然若是........,那麼,不然若是........,那麼....,不然...."
if條件語句多分支:
if <條件表達式1>
then
指定2
else
指定3
fi
提示:
多分支elif 的寫法,每一個elif都要帶有then.
注意結尾的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
case條件語句至關於分支的if/elif/else 條件語句,可是它比這些條件語句看起來更規範更工整,常被應用於實現系統服務啓動腳本等企業應用場景中。
case條件語句的語法格式爲:
case "常量」 in
值1)
指令1..
;;
值 2)
指令2..
;;
*)
指令 3..
esec
說明:當變量的值等於值1,執行指令1;等於值2時執行指令2,以此類推;若是都不符合,則執行「*)」後面的指令,即指令3.此外,注意不一樣行內容的縮進距離。
case 語句小結
語句就至關於多分支的if語句,case 語句的優點是更規範,易讀。
語句適合變量的值少,且爲固定的數字或字符串。{1,2,3}或{start,stop,restart}
系統服務啓動腳本傳參的判斷多用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
while 條件句
while 條件
do
指令
done
for 變量名 in 變量取值列表
do
指令...
done
打印列表元素
for n in {1..5}
do
echo $n
done
[root@CC scripts]# sh for1.sh
1
2
3
4
5
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
分離ctrl+a+d 查看screen -ls進入screen -r num
循環的特長是執行守護進程以及咱們但願循環不退出持續執行,用於頻率小於1分鐘循環處理(crond),其餘的while循環幾乎均可以被for循環替代。
語句能夠被if語句替換,通常在系統啓動腳本傳入少許固定規則字符串用case語句。其餘普通判斷多用if。
一句話,if ,for語句最經常使用,其次while(守護進程),case(服務啓動腳本)。
經過系統環境變量$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
多種取隨機數方法組合起來密碼更隨機
經過openssl產生
經過時間獲取隨機數
echo $(date +%N
uuid碼有硬件,時間,機器當前運行信息等組成,理論上在互聯網中是惟一的。
[root@cc34-moban ~]# uuidgen
5fc2a0b4-4ddf-4663-9022-ce3647ba8533
命令 |
說明 |
break n |
n表示跳出循環的層數,若是省略n表示跳出整個循環。 |
continue n |
n表示退出到第n層繼續循環,若是省略n表示跳過本次循環,忽略本次循環的剩餘代碼,進入循環的卜次循環 |
exit n |
退出當前shell程序,n爲返回值,n也能夠省略,在下一個shell 裏經過$?接收這個n的值。 |
return n |
用在函數裏,做爲函數的返回值,用於判斷函數執行是否正確 和exit同樣,若是函數裏有循環,也會直接退出循環,退出函數。 |
break跳出整個循環,繼續循環外後而的程序執行。
continue結束本次循環,繼續下一次循環。
exit退出核個腳本
調試技巧1:使用dos2unix處理腳本
從windows編輯的腳本到Linux下須要使用這個命令。
dos2unix windows.sh
調試技巧2:使用echo命令調試
在變量讀取或修改的先後加入echo$變量。也可在後面使用exit退出腳本這樣能夠不用註釋後面的代碼。
調試技巧3:利用bash的參數調試
sh [-nvx]
-n:不會執行該腳本,僅查詢腳本語法是否有問題,並給出錯誤提示。可用於生產服務哪些只執行一次不可逆的腳本。
-v:在執行腳本時,先將腳本的內容輸出到屏幕上而後執行腳本,若是有錯誤,也會給出錯誤提示。(不用)
-x:將執行的腳本內容及輸出顯示到屏幕上,經常使用。
要記得首先用dos2unix對腳本格式化。
直接執行腳本根據報錯來調試,有時報錯不許確。
調試整個腳本,顯示執行過程。
和set +x調試部分腳本(在腳本中設置)
輸出變量及相關內容,而後緊跟着exit退出,不執行後面程序的方式,一步步跟蹤腳本,對於邏輯錯誤比較好用。
寫法:echo $var;exit
最關鍵的是語法熟練、編碼習慣、編程思想,將錯誤扼殺在萌芽之中,減輕負擔,提升效率。