1. 程式人生 > >編寫簡單的Shell腳本

編寫簡單的Shell腳本

shell bash shell變量 shell腳本 楊書凡

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


shell腳本基礎

1. 編寫第一個shell腳本

Linux中的shell腳本是一個特殊的應用程序,介於操作系統內核和用戶之間,充當了一個命令解釋器的角色,負責接收用戶的操作指令並進行解釋,將需要執行的操作傳遞給內核執行,並輸出執行結果

常見的shell解釋器

可通過/etc/shells文件了解當前系統所支持的shell種類。而/bin/bash是大多數Linux默認的shell腳本

[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
……  //省略部分內容


編寫腳本文件

將平時使用的各種Linux命令按順序保存到一個文本文件,然後添加執行權限,這個文件就是一個shell腳本了

[root@localhost ~]# vim first.sh           //新建first.sh文件
#!/bin/bash                               //腳本聲明                
# This is my first Shell-Script.          //註釋信息
cd /boot                                  //可執行語句
pwd
ls -lh vml*
[root@localhost ~]# . first.sh              //以下四種方式可執行腳本
[root@localhost ~]# sh first.sh
[root@localhost ~]# source first.sh
[root@localhost ~]# chmod +x first.sh
[root@localhost ~]# ./first.sh              //這種方式需要文件有x權限,而上面三種不需要


2. 重定向與管道操作

(1)重定向操作

Linux系統使用文件來描述各種硬件、設備等資源。而用戶通過操作系統處理信息的過程中,包括以下幾類交互設備文件:

技術分享圖片


在實際Linux系統維護中,可以改變輸出、輸入內容的方向,不使用默認的標準輸入、輸出設備,這種操作稱為重定向

技術分享圖片


(2)管道操作

管道操作為不同命令之間的協同工作提供了一種機制,位於管道符號“|”左側的命令輸出的結果,作為右側命令的處理對象,同一個命令中可以有多個管道

[root@localhost ~]# grep “bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
teacher:x:500:500:BENET Linux Teacher:/home/teacher:/bin/bash

[root@localhost ~]# grep “bash$” /etc/passwd | awk  -F:  ‘{print $1,$7}’
root  /bin/bash
teacher  /bin/bash



使用shell變量

shell變量用來存放系統和用戶需要使用的特定參數,而且這些參數可以根據用戶的設定或系統環境的變化而相應變化。通過shell變量,shell程序能夠提供更加靈活的功能,適應性更強

常見shell變量的類型包括自定義變量、環境變量、位置變量、預定義變量

技術分享圖片自定義變量:由用戶自己定義、修改和使用

技術分享圖片環境變量:由系統維護,用於設置工作環境

技術分享圖片位置變量:通過命令行給腳本程序傳遞參數

技術分享圖片預定義變量:Bash中內置的一類變量,不能直接修改


1. 自定義變量

(1)定義新的變量

定義變量的基本技術分享圖片格式為“變量名=變量值”,變量名以字母或下劃線開頭,區分大小寫,建議全大寫

(2)查看和引用變量的值

基本技術分享圖片格式為:echo $變量名

[root@localhost ~]# xing=yang
[root@localhost ~]# ming=shufan
[root@localhost ~]# echo $xing
yang
[root@localhost ~]# echo $xing $ming
yang shufan
[root@localhost ~]# echo ${xing}shufan
yangshufan


(3)變量賦值的特殊操作

賦值時使用引號:

技術分享圖片雙引號("):當賦值內容中包含空格時,必須使用雙引號,允許通過$符號引用其他變量值

技術分享圖片單引號('):當賦值內容中包含特殊字符時,必須使用單引號

技術分享圖片反撇號(`):命令替換,提取命令執行後的輸出結果

[root@localhost ~]# xingming="yang $ming"       //雙引號的應用
[root@localhost ~]# echo $xingming
yang shufan
[root@localhost ~]# xingming='yang $ming'       //單引號的應用
[root@localhost ~]# echo $xingming
yang $ming
[root@localhost ~]# aaa=`grep “bash$" /etc/passwd`       //反撇號的應用
[root@localhost ~]# echo $aaa
root:x:0:0:root:/root:/bin/bash

技術分享圖片

除了上述情況可以賦值外,還可以使用read命令進行賦值

[root@localhost ~]# read xing
yang
[root@localhost ~]# echo $xing
yang


(4)設置變量的作用範圍

默認情況下,新定義的變量只在當前shell環境中有效,稱為局部變量,當進入子程序或新的子shell環境時,將無法使用。為了使用戶自定義的變量在多有子shell環境中能繼續使用,可以通過內部命令export將指定變量導出為“全局變量”,可同時指定多個變量名作為參數,變量名之間以逗號分隔

[root@localhost ~]# echo $xing $ming
yang shufan
[root@localhost ~]# export xing ming           //將xing、ming設為全局變量
[root@localhost ~]# bash                       //進入子shell環境
[root@localhost ~]# echo $xing $ming           //調用父shell的全局變量
yang shufan  
[root@localhost ~]# exit                       //返回原有的shell環境

[root@localhost ~]# export  xingming=yangshufan
[root@localhost ~]# echo $xingming           //新建一個名為xingming的全局變量
yangshufan


(5)數值變量的運算

在bash shell環境中,只能進行簡單的整數運算,不支持小數運算,通過expr命令進行,格式如下:

expr 變量1 運算符 變量2 [運算符 變量3] ...

技術分享圖片 常用的幾種運算符如下所示:

技術分享圖片加法運算:+

技術分享圖片減法運算:-

技術分享圖片乘法運算:\* 不能僅使用*,否則將當成文件通配符

技術分享圖片除法運算:/

技術分享圖片求模(取余)運算:% 計算數值相除後的余數

[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

[root@localhost ~]# abc=`expr $x + $y `     //將運算結果賦值給變量abc
[root@localhost ~]# echo $abc
51



2. 環境變量

環境變量由系統提前創建的一類變量,主要用戶設置用戶的工作環境,由Linux系統自動維護,會隨著用戶狀態的改變而改變,可以使用env命令查看當前工作環境下的環境變量

技術分享圖片


PATH變量用於可執行程序的默認搜索路徑

[root@localhost ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# PATH="$PATH:/root" 
[root@localhost ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root


3. 位置變量

位置變量也稱位置參數,使用$1、$2、$3、…、$9表示

[root@localhost ~]# vim xxx.sh
#!/bin/bash
sum='expr $1 + $2'
echo "$1 + $2 = $sum"

[root@localhost ~]# . xxx.sh  12  34
12 + 34 = 46
[root@localhost ~]# . xxx.sh  10  50
10 + 50 = 60



4. 預定義變量

預定義變量是由bash程序預先定義好的一類特殊的變量,用戶只能使用預定義變量,而不能創建新的預定義變量,也不能為預定義變量賦值。使用$符號和另一個符號組合表示,下面是幾個常用的預定義變量:

$#:表示命令行中位置參數的個數

$*:表示所有位置參數的內容

$?:表示前一條命令執行後的返回狀態,返回值為0表示執行正確,非0表示執行異常

$0:表示當前執行的腳本或程序的名稱


[root@localhost ~]# cat mybak.sh
#!/bin/bash
TARFILE=beifen-`date +%s`.tgz
tar zcf $TARFILE $* &> /dev/null
echo "已執行 $0 腳本,"
echo "共完成 $# 個對象的備份"
echo “具體內容包括: $*” 
[root@localhost ~]# ./mybak.sh  /etc/passwd  /etc/shadow 
已執行 ./mybak.sh 腳本,
共完成 2 個對象的備份
具體內容包括:/etc/passwd /etc/shadow




shell腳本與任務計劃

案例:某公司使用MySQL數據庫,需要對MySQL服務器中的yang庫進行遠程備份,每天淩晨2:30執行,每個備份為獨立的.sql文件,然後壓縮為.tar.gz格式,文件名嵌入執行備份時的日期和時刻

技術分享圖片


配置步驟如下:

(1)創建一個專用的數據庫備份賬戶ysf,允許從備份主機192.168.1.2連接到MySQL數據庫,並授予對yang庫的讀取權限。使用備份工具mysqldump時,還需要對庫設置select和lock tables權限

技術分享圖片


(2)從MySQL客戶端中測試數據庫訪問、查詢授權是否有效,或使用備份mysqldump工具進行測試

技術分享圖片



(3)在MySQL客戶端編寫MySQL備份腳本,並測試能夠成功備份

技術分享圖片

技術分享圖片


(4)設置計劃任務

技術分享圖片

技術分享圖片技術分享圖片




編寫簡單的Shell腳本