Shell腳本應用(一)

隨着Linux系統在企業中的應用越來越多,服務器的自動化管理也變得越來越重要。在Linux服務器的自動化維護工作中,除了計劃任務的設置以外,Shell腳本的應用也是非常重要的一部分。作爲Linux系統運維工程師,必須得要掌握Shell腳本的基本知識和編寫及使用。

shell腳本基礎

在一些複雜的Linux維護工作中,大量重複性的輸入和交互操作不僅費時費力,而且容易出錯,而編寫一個恰到好處的Shell腳本程序,可以批量處理、自動化地完成一些列維護任務,大大減輕管理員的負擔。

一、編制shell腳本

Linux系統中的Shell腳本是一個特殊的應用程序,它介於操作系統內核與用戶之間,充當了一個“翻譯官”的角色,負責接收用戶輸入的操作指令並進行解釋,將需要執行的操作傳遞給內核執行,並輸出執行結果。如圖:
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腳本。

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            
/                                                                     //查看腳本的執行結果和命令行執行的結果是一樣

執行腳本的方法:

  1. “./”:(相對或絕對路徑)這種方法腳本必須得需要可執行權;
  2. sh:通過/bin/sh來解釋腳本;
  3. source或“.”:內部命令來加載腳本中的內容。
    前兩種方法是在子shell中執行;第三種方法是在當前shell中執行!

二、重定向與管道操作

由於shell腳本的“批量處理”的特殊性,其大部分操作過程以靜默的方式運行,不需要用戶干預。因此學會提取、過濾執行信息變得十分重要。

1.重定向操作

用戶通過操作系統處理信息的過程中,包括三類交互設備文件:
Shell腳本應用(一)
標準輸入:從該設備接收用戶輸入的數據;
標準輸出:通過該設備向用戶輸出數據;
標準錯誤:通過該設備報告執行出錯信息。

重定向的類型分爲:
Shell腳本應用(一)

2.管道操作

管道符的作用就是將左側的命令輸出結果,作爲右側命令的處理對象。比如:

[root@localhost ~]# df -hT | grep "/$" | awk '{print $6}'
26%
//提取根分區(/)的磁盤使用率信息

三、shell變量

各種Shell環境中都使用到了“變量”的概念。Shell變量用來存放系統和用戶需要使用的特定參數(值),而且這些參數可以根據用戶的設定或系統環境的變化而相應變化。通過適當地使用變量,Shell程序能夠提供更加靈活的功能,適應性更強。

Linux系統下常見的四種變量:

1.自定義變量

自定義變量是由系統用戶自己定義的變量嗎,只在用戶自己的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

2.環境變量

環境變量指的處於運行需要由Linux系統提前創建好的一類變量。環境變量的值由Linux系統自動維護,會隨着用戶狀態的改變而改變。
使用env命令可以查看當前的所有環境變量,以便了解各個變量的用途!
在Linux系統中,環境變量的全局配置文件爲/etc/profile,在此文件中定義的變量作用域所有用戶。每個用戶也有自己的環境變量配置文件(~/.bash_profile)。

3.位置變量

當執行命令行操作時,第一個字段表示命令字或腳本程序名,其餘的字符串按照從左到右的順序依次賦值給位置變量。
位置變量也稱爲位置參數,使用$1、$2…$8、$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爲12、$2爲34時
12 + 34=46

4.預定義變量

預定義變量是由Bash程序預先定義好的一類特殊變量,用戶不可修改,預定義變量的格式:

  • $#:命令行中位置變量的個數
  • $*:所有位置變量的內容
  • $?:上一條命令執行後返回的狀態,當返回狀態值爲0時表示執行正常,非0值表示執行異常或出錯
  • $0:當前執行的進程/程序名

建議寫在腳本中的命令,應先在命令行,執行完成確認結果之後,再寫入腳本中。第一次編寫腳本,可能會麻煩一些,當腳本編寫完成之後,以後再有類似的需求,直接運行腳本即可!

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