編寫簡單的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腳本