Shell腳本基礎

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

shell腳本基礎

在一些複雜的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服務器

1、編制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腳本。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            
/                                                                     //查看腳本的執行結果和命令行執行的結果是同樣

執行腳本的方法:測試

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

2、重定向與管道操做

因爲shell腳本的「批量處理」的特殊性,其大部分操做過程以靜默的方式運行,不須要用戶干預。所以學會提取、過濾執行信息變得十分重要。

1.重定向操做

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

重定向的類型分爲:
Shell腳本基礎

2.管道操做

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

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

3、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.位置變量

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

4.預約義變量

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

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

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

相關文章
相關標籤/搜索