1. 程式人生 > >Linux裏你必須掌握的Shell語法

Linux裏你必須掌握的Shell語法

Shell for case Expect



For循環

##通常For循環用來執行一些重復不變步驟
		for i in `ls /tmp`    ##為ls /tmp設置變量為i
	   	do 		      ##所以執行do與Done內的操作,do對應需要done結尾
		rm -rf $i	      ##刪除ls /tmp查詢到的內容
		done
##參考
         #!/bin/sh
         for i in `seq 10`
         do
         echo $i
         done
##分庫備份
#!/bin/bash
dbpass="dahaoshanhe123"
dbsock=/u01/instance/3306/3306.sock
dblist="show databases;"|grep -Evi "Database|info|per|test|mysql"
dbopt="-B -F --single-transaction --master-data=2 --set-gtid-purged=OFF --triggers --routines --events"

for dbname in `mysql -uroot -p${dbpass} -S ${dbsock} -e $dblist`
do
/usr/local/mysqlone/bin/mysqldump -p${dbpass} -S ${dbsock} ${dbopt} $dbname |gzip >  /u01/instance/3306/backup/${dbname}_$(date +%F)_$(date +%T).sql.gz
done



IF 判斷語句

常用條件判斷:

===判斷文件是否存在

-f 判斷某普通文件是否存在

-d 判斷某目錄是否存在

===判斷文件權限

-r 判斷文件是否為可讀的屬性

-w 判斷文件是否為可以寫入的屬性

-x 判斷文件是否為可執行的屬性

===值比較

-eq 等於 應用於:整型比較

-ne 不等於 應用於:整型比較

-lt 小於 應用於:整型比較

-gt 大於 應用於:整型比較

-le 小於或等於 應用於:整型比較

-ge 大於或等於 應用於:整型比較

===邏輯的(and)與(or)

&& 邏輯的 AND 的意思, -a 也是這個意思

|| 邏輯的 OR 的意思, -o 也是這個意思

格式一:
#!/bin/bash
echo '				##打印一個菜單,以單引號開頭結尾
===============================
     1+1=?
===============================
'         
read -p '請輸入你的答案': nub		##read -p  添加註釋,nub代表用戶輸入的內容
        
if [ $nub -ne 2 ];then				##對用戶輸入的值進行判斷,如果不為2,then代表則執行下面操作
echo "這都能算錯,洗洗睡吧"			##如果輸入值不等2 反饋信息-->"這都能算錯,洗洗睡吧"
else							   ##否則
echo "小夥子很機智嘛"				   ##反饋-->"小夥子很機智嘛"
fi


格式二:
#!/bin/bash
echo '
===============================
     1+1=?
===============================
'         
read -p '請輸入你的答案': nub
        
if [ $nub -ne 2 ];then
echo "這都能算錯,洗洗睡吧" 
elif [ $nub -eq 2 ];then
echo "小夥子很機智嘛"
fi

##牢記常見的條件判斷比如-eq,-ne,以及if判斷的語法格式,[]內判斷寫法,前後需要有空格



While循環

格式:
while < 孩子年齡 > 18 >    ##循環判斷,孩子是否滿18周歲
do					
不可以去網吧			##判斷不滿足條件,不可以去網吧,腳本結束
done

案例一:
#!/bin/bash
##連通性觀察記錄小腳本
##得出的的結果應該是18秒每次的間隔,添加監控IP只需要修改PIP的變量值即可
##運行時只需要sh shell_name &
##結束時只需要獲取PID號碼進行kill即可
PPATH=/root/IP監控/                             #設置一個存放連通性記錄文件的位置
PIP="192.168.56.22"                             #添加一個要測試的IP
echo $$ > /root/IP監控/ping.pid        #打印該進程id到指定文件
[ ! -d $PPATH ] && mkdir -p $PPATH      #判斷該路徑是否存在,如果不存在則創建該路徑
 
while true         #使用while無條件循環,若true永遠執行該腳本除非手動停止,當然這個根據場景
do
/bin/ping $PIP -c 4 >/dev/null 2>&1             #在這裏ping 4個失敗的包將花去13秒
if [ $? -ne 0 ];then                            #判斷上一步ping執行是否成功,判斷若不成功則執行下一步
/bin/date >> $PPATH${PIP}.txt                   #打印ping不成功當前時間
fi
sleep 5                 #這裏睡眠5秒,繼續返回進行下一輪循環
done

## while true  #無限循環,除非手動停止
## while [-f /tmp/11]  ##如果/tmp下存在11文件則循環do-done的操作,當11不存在時腳本結束


Case語句

案例一:
#!/bin/sh
echo '
===============================
        1. install http
        2. install mysql
===============================
'
read -p '請輸入需要安裝的程序編號': nub
case "$nub" in
        1)				##若用戶輸入的nub的變量值為1,則執行該步驟
                yum install httpd -y	##執行的操作
        ;;							  ##固定格式,最後一個選項esac前不需要添加該符號
        2)				##若用戶輸入的nub的變量值為2,則執行該步驟
                yum install -y iftop	
        ;;
        *)				##若輸入的內容不上以上的選項
                echo "Please input [1/2]"
esac				##case開頭,case結尾

案例二:
case "$1" in
        1)				##若用戶輸入$1的變量值為1,則執行該步驟
                yum install httpd -y	##執行的操作
        ;;							  ##固定格式,最後一個選項esac前不需要添加該符號
        2)				##若用戶輸入的nub的變量值為2,則執行該步驟
                yum install -y iftop	
        ;;
        *)				##若輸入的內容不上以上的選項
                echo "Please input [1/2]"
esac				##case開頭,case結尾



Shell函數

#!/bin/bash
. /etc/init.d/functions			##加載函數

function start(){				##定義一個start的啟動函數,{}內為執行函數進行的動作操作
service httpd start > /dev/null 2>&1	
if [ $? = 0 ];then
action "啟動中..." /bin/true	  ##若啟動無報錯,則顯示[  OK  ]
else
action "啟動中..." /bin/false	  ##若啟動無報錯,則顯示[FAILED]
fi
}

function stop(){
service httpd stop > /dev/null 2>&1
if [ $? = 0 ];then
action "停止中..." /bin/true
else
action "停止中..." /bin/false
fi
}

function main(){
if [ $1 = "start" ];then
start
elif [ $1 = "stop" ];then
stop
fi
}

main $*			##這裏的$*就是把命令行接受的參數作為函數參數傳給函數內部,是一種常用的手法


Expect交互自動化

當安裝某個服務時,程序會交互的方式要求用戶配置程序,比如在配置Redis、MySQL、OSSEC時

[root@localhost ~]# mysql_secure_installation 
Set root password? [Y/n] Y
New password: 
Re-enter new password: 
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

使用Expect後這些Y將由程序代替人工輸入,對於某些沒有RPM包的程序,比如OSSEC實現自動化部署成為一個可能

關於Expect更多資料可以查看本博客expect自動化交互腳本(1-3)



Linux裏你必須掌握的Shell語法