隨着Linux系統在企業中的應用愈來愈多,服務器的自動化管理也變得愈來愈重要。在Linux服務器的自動化維護工做中,除了計劃任務的設置之外,Shell腳本的應用也是很是重要的一部分。做爲Linux系統運維工程師,必須得要掌握Shell腳本的基本知識和編寫及使用。php
在一些複雜的Linux維護工做中,大量重複性的輸入和交互操做不只費時費力,並且容易出錯,而編寫一個恰到好處的Shell腳本程序,能夠批量處理、自動化地完成一些列維護任務,大大減輕管理員的負擔。python
若是使用的較老版本的Shell,建議將其更新至最新版本,由於老版的Shell出現了很是嚴重的錯誤。檢測系統Shell是否存在漏洞,使用如下命令:shell
[root@localhost ~]# env x='() { :;}; echo be careful' bash -c "echo this is ok" this is ok //這種狀況表示沒有問題 be careful //這種狀況就須要更新
更新方法以下:vim
[root@localhost ~]# yum -y update bash
學習測試環境,使用較老版本的Shell也沒有問題,可是生產環境中,必須更新Shell!!!bash
這個問題解決以後,下面開始介紹Shell服務器
Linux系統中的Shell腳本是一個特殊的應用程序,它介於操做系統內核與用戶之間,充當了一個「翻譯官」的角色,負責接收用戶輸入的操做指令並進行解釋,將須要執行的操做傳遞給內核執行,並輸出執行結果。如圖:
Linux系統中常見的shell解釋程序有不少種,使用不一樣的shell腳本時,其內部指令、命令提示燈方面會存在一些區別。運維
[root@localhost ~]# cat /etc/shells //查看當前系統支持哪些shell * /bin/sh * /bin/bash * /sbin/nologin * /usr/bin/sh * /usr/bin/bash * /usr/sbin/nologin * /bin/tcsh * /bin/csh [root@localhost ~]# /bin/sh //切換shell sh-4.2# exit //返回上一層shell [root@localhost ~]#/bin/bash是目前大多數Linux版本採用的默認shell腳本。ide
shell腳本:簡單來講就是把在命令行執行的命令按順序存放在一個文本文件中,賦予其可執行權限。那麼這個文本文件就可稱爲一個腳本。好比:學習
[root@localhost ~]# cd / [root@localhost /]# pwd / //這是兩條命命輸出的結果 [root@localhost ~]# vim a.sh //編寫爲本文件,以「.sh」結尾只是爲了讓別人知道這是一個腳本。 cd / pwd [root@localhost ~]# chmod +x a.sh //服務文本文件可執行的權限 [root@localhost ~]# ./a.sh / //查看腳本的執行結果和命令行執行的結果是同樣
執行腳本的方法:測試
因爲shell腳本的「批量處理」的特殊性,其大部分操做過程以靜默的方式運行,不須要用戶干預。所以學會提取、過濾執行信息變得十分重要。
用戶經過操做系統處理信息的過程當中,包括三類交互設備文件:
標準輸入:從該設備接收用戶輸入的數據;
標準輸出:經過該設備向用戶輸出數據;
標準錯誤:經過該設備報告執行出錯信息。
重定向的類型分爲:
管道符的做用就是將左側的命令輸出結果,做爲右側命令的處理對象。好比:
[root@localhost ~]# df -hT | grep "/$" | awk '{print $6}' 26% //提取根分區(/)的磁盤使用率信息
各類Shell環境中都使用到了「變量」的概念。Shell變量用來存放系統和用戶須要使用的特定參數(值),並且這些參數能夠根據用戶的設定或系統環境的變化而相應變化。經過適當地使用變量,Shell程序可以提供更加靈活的功能,適應性更強。
自定義變量是由系統用戶本身定義的變量嗎,只在用戶本身的Shell環境中有效,所以,也有人稱爲本地變量。在編寫Shell腳本程序是,用戶一般會設定一些特定的自定義變量,以適應程序執行過程當中各類變化,以知足不一樣的需求。
1)定義新的變量
定義變量的基本格式「變量名=變量值」,等號兩邊不容許有空格。變量名稱須要以字母或下劃線開頭,名稱中不要包含特殊字符(好比:+、-、*、/、……?、&、%等)。好比:
[root@localhost ~]# product=php [root@localhost ~]# version=7.3.1
2)查看和引用變量
一般在變量名稱前添加前導符「$」,能夠引用一個變量的值。好比:
[root@localhost ~]# echo $product php [root@localhost ~]# echo $product $version php 7.3.1
當變量名稱容易和緊跟其後的其餘字符相互混淆時,須要使用「{}」將變量括起來,不然將報錯。好比:
[root@localhost ~]# echo $product1234 //沒有找到「product1234」這個變量 [root@localhost ~]# echo ${product}1234 //正確輸出變量和字符 php1234
3)變量賦值的特殊操做
1.雙引號(" "):雙引號主要起界定字符串的做用,特別是當要複製的內容中包含空格是,必須以雙引號括起來,其餘狀況雙引號能夠省略。好比:
[root@localhost ~]# Python=python 2.3.7 bash: 2.3.7: 未找到命令... [root@localhost ~]# python="python 2.3.7" [root@localhost ~]# echo $python python 2.3.7
雙引號還容許經過$符號引用其餘變量值,好比:
[root@localhost ~]# SQL="SQLServer $version" [root@localhost ~]# echo $SQL SQLServer 1.2.3
2.單引號(' '):禁止引用其餘變量值,$視爲普通字符,單引號中的特殊符號都將視爲普通字符,好比:
[root@localhost ~]# SQLServer='SQLserver $version' [root@localhost ~]# echo $SQLServer SQLserver $version
3.反撇號(
):主要用於命令替換,容許將執行某個命令的屏幕輸出結果賦值給變量。反撇號括起來的內容必須是能夠執行的命令,不然將出錯。好比:
[root@localhost ~]# ls -lh `which systemctl` -rwxr-xr-x. 1 root root 623K 11月 7 2016 /usr/bin/systemctl
注意:使用反撇號難以子啊一行命令中實現嵌套命令替換操做,這時可使用「$()」來替代反撇號操做,解決嵌套問題。好比:
[root@localhost ~]# rpm -qc $(rpm -qf $(which useradd)) /etc/default/useradd /etc/login.defs //查詢提供useradd命令程序的軟件包所安裝的配置文件位置
4.大括號({}):用來分割變量和字符;若是在變量後還有其餘字符,就須要使用「{}」,{}中是變量。
4)read命令
read命令可使從鍵盤輸入的內容爲變量賦值,好比:
[root@localhost ~]# read abc /opt/backup //輸入給變量abc所賦的值 [root@localhost ~]# echo $abc /opt/backup //查看結果
爲了使交互式操做的界面更加友好,提升易用性,read命令能夠加「-p」選項來設置提示信息,以便告知用戶應該輸入什麼內容等。好比:
[root@localhost ~]# read -p "請指定存放的目錄:" abcd 請指定存放的目錄:/opt/backup [root@localhost ~]# echo $abcd /opt/backup
5)設置變量的做用範圍
默認狀況下,新定義的變量只能在當前Shell環境中有效,所以稱爲局部變量;當進入子程序或者新的Shell時,局部變量將不能使用。好比:
[root@localhost ~]# echo "$SQL $version" SQLServer 1.2.3 1.2.3 [root@localhost ~]# /bin/sh //切換一個Shell環境 sh-4.2# echo "$SQL $version" //找不到這樣的變量 sh-4.2# exit //返回上一個Shell [root@localhost ~]#
爲了使用戶定義的變量能夠在全部Shell環境中繼續使用,減小重複的工做,能夠經過內部命令export將指定的變量導出爲全局變量。用戶能夠同時指定多個變量名稱做爲參數(無需使用「$」符),變量之間用空格分割便可!
[root@localhost ~]# export SQL version [root@localhost ~]# /bin/sh sh-4.2# echo "$SQL $version" SQLServer 1.2.3 1.2.3 //測試成功
6)數值變量的運算
在Bash Shell環境中,只能進行簡單的整數運算,不支持小數運算。數值運算主要是經過內部命令expr進行。
經常使用的變量:
- 加法運算:+
- 減法運算: -
- 乘法運算: *
- 除法運算: /
- 求模(取餘)運算: %
好比:
[root@localhost ~]# x=35 [root@localhost ~]# y=16 [root@localhost ~]# expr $x + $y 51 [root@localhost ~]# expr $x - $y 19 [root@localhost ~]# expr $x \* $y 560 [root@localhost ~]# expr $x / $y 2 //只取整數 [root@localhost ~]# expr $x % $y 3
環境變量指的處於運行須要由Linux系統提早建立好的一類變量。環境變量的值由Linux系統自動維護,會隨着用戶狀態的改變而改變。
使用env命令能夠查看當前的全部環境變量,以便了解各個變量的用途!
在Linux系統中,環境變量的全局配置文件爲/etc/profile,在此文件中定義的變量做用域全部用戶。每一個用戶也有本身的環境變量配置文件(~/.bash_profile)。
當執行命令行操做時,第一個字段表示命令字或腳本程序名,其他的字符串按照從左到右的順序依次賦值給位置變量。
位置變量也稱爲位置參數,使用$一、$2…$八、$9表示。好比:
[root@localhost ~]# vim 123.sh #!/bin/bash //聲明使用何種Shell SUM=`expr $1 + $2` echo "$1 + $2=$SUM" [root@localhost ~]# chmod +x 123.sh [root@localhost ~]# ./123.sh 12 34 //$1爲十二、$2爲34時 12 + 34=46
預約義變量是由Bash程序預先定義好的一類特殊變量,用戶不可修改,預約義變量的格式:
- $#:命令行中位置變量的個數
- $*:全部位置變量的內容
- $?:上一條命令執行後返回的狀態,當返回狀態值爲0時表示執行正常,非0值表示執行異常或出錯
- $0:當前執行的進程/程序名
建議寫在腳本中的命令,應先在命令行,執行完成確認結果以後,再寫入腳本中。第一次編寫腳本,可能會麻煩一些,當腳本編寫完成以後,之後再有相似的需求,直接運行腳本便可!