Linux裏你必須掌握的Shell語法
阿新 • • 發佈:2018-02-27
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語法