shell腳本基礎知識一

1  shell腳本基礎知識

1.1  目錄

  • shell簡介
    • 什麼是shell
    • 什麼是shell腳本
    • shell腳本在linux系統運維工作中的地位
  • shell腳本的建立和執行
    • shell腳本的建立
    • shell腳本的執行
    • shell腳本開發的基本規範及習慣
  • shell腳本變量
    • 什麼是變量
    • 環境變量
    • 普通變量
    • shell中的特殊位置參數變量
    • 特殊進程中的狀態變量
  • shell腳本的條件測試與比較
    • 條件測試方法
    • test和[]
    • 文件測試
    • 字符串測試
    • 整數測試
    • 邏輯測試
  • if條件語句及實戰
    • if條件語句語法
    • if條件語句實戰
  • case條件語句及實戰
    • case條件語句語法
    • case條件語句實戰

1.2  shell簡介

1.2.1  什麼是shell

shell是指“提供使用者使用界面”的軟件(命令解析器)。它類似於DOS下的command和後來的cmd.exe。它接收用戶命令,然後調用相應的應用程序。

1.2.2  什麼是shell腳本

Shell腳本與Windows/Dos下的批處理相似,也就是用各類命令預先放入到一個文件中,方便一次性執行的一個程序文件,主要是方便管理員進行設置或者管理用的。

1.2.3  shell腳本在linux系統運維工作中的地位

Shell腳本語言很適合用於處理純文本類型的數據,而Linux系統中幾乎所有的配置文件、日誌文件(如NFS、Rsync、Httpd、Nginx、LVS、MySQL等),以及絕大多數的啓動文件都是純文本類型的文件。因此,學好Shell腳本語言,就可以利用它在Linux系統中發揮巨大的作用。_auto_0

1.3  shell腳本的建立和執行

1.3.1  shell腳本的建立

shell腳本在編輯器vi(vim)中編寫 1.腳本開頭

#!/bin/bash或#!/bin/sh 符號#!用來告訴系統它後面的參數是用來執行該文件的程序 2.腳本註釋 以#開頭的行表示註釋_auto_0由上圖可見,sh爲bash的軟鏈接,大多數情況下,在腳本的開頭使用“#!/bin/bash”和“#!/bin/sh”是沒有區別的,但是更規範的寫法是在腳本開頭使用“#!/bin/bash”

1.3.2  shell腳本的執行

通常採用以下幾種方法:
1.bash 腳本文件名或sh 腳本文件名;注意,腳本文件名需爲絕對路徑,如不是,則需進入文件所在目錄後再執行
2.路徑/腳本文件名 或./腳本文件名;注意,需先加可執行權限,使用chmod +x 腳本文件名
3.source 腳本文件名或. 腳本文件名;
前兩種方法的執行方式其實是一樣的,都是在當前父進程下的子進程中執行,子進程完成後,子進程中的各項變量或操作將會結束而不會傳回到父進程中.
具體的區別可見下圖:_auto_1

1.3.3  shell腳本開發的基本規範及習慣

腳本編寫規範
1.第一行指定腳本解釋器

#!/bin/bash或#!/bin/sh
2.腳本開頭加版本和版權信息_auto_2

知識補充,添加版本信息的方法:
vim .~/vimrc
autocmd BufNewFile .py,.cc,.sh,.java exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == "sh"
call setline(1,"#!/bin/bash")
call setline(2,"#Author:ZhangMiaomiao")
call setline(3,"#http://blog.csdn.net/moledyzhang")
call setline(4,"#Time:".strftime("%F %T"))
call setline(5,"#Name:".expand("%"))
call setline(6,"#Version:V1.0")
call setline(7,"#Description:")
endif
endfunc

3.儘量不用中文(不限於註釋)
4.爲便於標識,以.sh爲擴展名
5.一行一條命令;若一行多個命令,用分號(;)分割;長命令可以使用反斜線字符(\)
6.放在固定路徑下,文件名儘量描述清楚腳本的功能
良好的習慣:
1.成對符號,如‘’,“”,``,(),{},[]等儘量一次性寫出來
2.[的右端和]的左端留空格
3.對於流程控制語句,應一次性寫完,如
if ;then
內容
fi
再如:
for
do
內容
done
4.代碼縮進
5.所有的單引號、雙引號和反單引號等其他標點符號都需要在英文狀態下輸入
6.變量賦值時等號=左右兩面不留空格

1.4  shell腳本變量

1.4.1  什麼是變量

變量就是暫時存放數據的地方及數據標記,所存儲的數據存放在內容空間當中,通過正確地調用內存空間中的變量的名字就可以取出與變量對應的數據。 使用變量的好處是使程序開發更加方便

1.4.2  變量類型

全局變量(環境變量):可以在創建的它們的shell及其派生出來的任意子進程shell中使用,環境變量又可以分爲自定義環境變量和bash內置的環境變量,(環境變量一般用於定義shell運行環境,保證shell命令的正確執行.) 局部變量(普通變量):只能在創建他的shell函數或腳本中進行操作調用

1.4.3  環境變量

1.4.4  普通變量

1.變量的命名 變量名的命名須遵循如下規則: 首個字符必須爲字母(a-z,A-Z)
中間不能有空格,可以使用下劃線(_)
不能使用標點符號
不能使用bash裏的關鍵字(可用help命令查看保留關鍵字)
2.變量的賦值
變量名=值
變量名='值'
變量名="值"
變量名=`值`
單引號:所有轉移符全部關閉,完整的反應括號中的內容

雙引號:部分轉義符關閉,但某些則保留(如:$)

反引號:反引號內榮作爲一個系統命令並執行

3.變量的調用

1) $變量名

2) ${變量名}

1.4.5  shell中的特殊位置參數變量

_auto_0

1.4.6  特殊進程中的狀態變量

_auto_2

1.5  shell腳本的條件測試與比較

1.5.1  條件測試方法

通常在腳本的編寫過程中需要進行各種測試,然後根據測試結果執行不同的操作,有時也會與if等條件語句結合來完成測試 條件測試常用的語法_auto_3[[]]中可以使用通配符進行匹配 (())常用於整數運算

補充:邏輯操作符&&合||
例:
rm -rf / || echo "me is loser" (||的含義)
當rm -rf /執行不成功時,就輸出me is loser
rm -rf / && echo "快跑路吧兄弟"
當rm -rf /執行成功時,就輸出快跑路吧兄弟

1.5.2  文件測試

常見的文件測試操作符如下:_auto_4

1.5.3  字符串測試

常見的字符串測試操作符如下:_auto_5

1.5.4  整數測試

常見的整數測試操作符如下:_auto_6

1.5.5  邏輯測試

常見的邏輯測試操作符如下:_auto_7

1.6  if條件語句及實戰

1.6.1  if條件語句語法

1、單分支
if <條件表達式>;then
操作
fi
2、雙分支
if <條件表達式>;then
操作1
else
操作2
fi
3、多分支
if <條件表達式>;then
操作1
elif <條件表達式>;then
操作2
elif <條件表達式>;then
操作3
......
else
操作
fi

1.6.2  if條件語句實戰

監控MySQL的企業案例
案例描述:監控mysql服務的運行狀態,如果正常則輸出“MySQL is running.”,否則輸出“MySQL is stoped.”
—————————————————————思路比技術更重要————————————————————
思路分析:
1.環境準備
2.監控mysql服務是否異常
1)監控mysql服務的方法有哪些
2)如何找出測試條件
3.開發監控腳本
具體實現:
1.環境準備
yum -y install mysql-server
service mysqld start
2.解決思路 1)查mysql服務的狀態
2)判斷相應的命令結果判斷是否正常
_auto_2

3.開發監控腳本
方法一:端口判斷

#!/bin/bash

#Author:ZhangMiaomiao

#http://blog.csdn.net/moledyzhang

#Time:2017-10-10 01:19:26

#Name:monitor_mysql.sh

#Version:V1.0

#Description:
port=`netstat -ntulp|grep mysql|wc -l`
if [ $port -eq 1 ];then
echo "MySQL is running."
else
echo "MySQL is stoped."
fi

方法二:進程判斷

ps -ef|grep mysql&>/dev/null 
if [ $? -eq 0 ];then
echo "MySQL is running."
else
echo "MySQL is stoped."
fi

或是
proc=`ps -ef|grep mysql|grep -v grep|wc -l`
if [ $proc -eq 2 ];then
echo "MySQL is running."
else
echo "MySQL is stoped."
fi

方法三:登錄判斷
mysql -h 172.18.45.58 -uroot -p123 -e "select version();"&>/dev/null
if [ $? -eq 0 ];then
echo "MySQL is running."
else
echo "MySQL is stoped."
fi

1.7  case條件語句及實戰

1.7.1  case條件語句語法

case "變量" in
值1|值2)
操作 ;;
值3|值4) 
操作 ;;
值5|值6) 
操作 ;;
*)
默認操作;;
esac

1.7.2  case條件語句實戰

nginx服務管理腳本
案例描述:已知nginx服務的管理命令如下:
啓動服務的命令:/usr/local/nginx/sbin/nginx
停止服務的命令:/usr/local/nginx/sbin/nginx -s stop
請用case語句開發腳本,以實現nginx服務啓動及關閉的功能,具體方法爲:/etc/init.d/nginx {start|stop|restart}或service nginx {start|stop|restart},並實現通過chkconfig進行開機自啓動管理
解決思路:
一、環境準備
下載nginx:http://nginx.org/en/download.html
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
tar -xvf nginx-1.12.1.tar.gz
cd tar -xvf nginx-1.12.1
./configure --prefix=/usr/local/nginx
make&&make install
開啓
/usr/local/nginx/sbin/nginx
二、腳本過程分析
1.先判斷nginx的pid文件是否存在(nginx服務正常啓動後pid文件就會存在),如果不存在,即表示nginx沒有運行,則運行nginx服務的啓動命令(start),待要停止時,如果pid文件存在,就運行nginx服務停止命令,否則不運行(stop函數)
2.通過case語句進行判斷,判斷的值爲start、stop、restart等
3.處理返回值,使得更專業
4.通過chkconfig管理nginx,實現開機自啓動
三、開發腳本 最後實現的腳本如下:

In [ ]:
#chkconfig: 35 85 15   #設定35級別,開機第85位啓動腳本,關機第15爲關閉腳本
#description:start/stop/restart nginx
path=/usr/local/nginx/sbin
pid=/usr/local/nginx/logs/nginx.pid
RETVAL=0        #設定RETVAL爲0,作爲返回值變量
. /etc/rc.d/init.d/functions  #加載系統函數庫,方便後面使用action等函數
start() #定義start函數
{
    if [ ! -f $pid ];then  #如果pid文件不存在,則執行啓動命令
        $path/nginx
        RETVAL=$?  #獲取啓動命令後的返回值
        if [ $RETVAL -eq 0 ];then
            action "Starting nginx:" /bin/true  #打印專業的啓動提示
            return $RETVAL
        else
             action "Starting nginx:" /bin/false #打印專業的啓動失敗提示
             return $RETVAL
        fi
    else
        echo "nginx is running"   #如果pid文件存在,則輸出正在運行的提示
        return 0
    fi
}
stop() #定義stop函數
{
    if [  -f $pid ];then  #如果pid文件存在,則執行停止命令
    $path/nginx -s stop
        RETVAL=$?  #獲取停止命令後的返回值
        if [ $RETVAL -eq 0 ];then
            action "Stopping nginx:" /bin/true  #打印專業的停止提示
            return $RETVAL
        else
             action "Stopping nginx:" /bin/false #打印專業的停止失敗提示
             return $RETVAL
        fi
    else
        echo "nginx is no running"   #如果pid文件不存在,則輸出已經停止的提示
        return $RETVAL
    fi
}
case "$1" in  #通過$1接收腳本的參數(start|stop|restart)
start)
    start
    RETVAL=$?;;   #獲取start函數執行後的返回值
stop)
    stop
    RETAVL=$?;;
restart)
    stop
    sleep 1
    start
    RETVAL=$?;;
*)
    echo "Usage:$0 {start|stop|restart}"
    exit 1;;
esac
exit $RETAVL  #將腳本的返回值返回值當前shell

執行結果如下圖:_auto_0然後加入開機自啓動:_auto_1

In [ ]:
chkconfig --add nginx
chkconfig nginx on
chkconfig nginx --list

----------------未完,待續----------


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