在一些複雜的Linux維護工作中,大量重覆的輸入和交互操作不但費時費力,容易出錯.這時候就需要用到腳本。 編寫腳本的好處: 批量的處理,自動化的完成維護,減輕管理員的負擔。 linux的shell腳本是一種特殊的應用程式,常見的shell解釋器有很多種,使用不同的shell時期內部指令:cat /e ...
在一些複雜的Linux維護工作中,大量重覆的輸入和交互操作不但費時費力,容易出錯.這時候就需要用到腳本。
編寫腳本的好處: 批量的處理,自動化的完成維護,減輕管理員的負擔。
linux的shell腳本是一種特殊的應用程式,常見的shell解釋器有很多種,使用不同的shell時期內部指令:cat /etc/shells
[root@xiaolyu ~]# cat /etc/shells
/bin/bash是大多數linux中預設的shell解釋器。之後的所有腳本的編寫都是bash腳本。
一、編寫第一個Shell腳本
將平時的操作命令順序的放入到文件中賦予執行許可權,一次的執行。
我們來編寫第一個腳本first.sh
linux不以尾碼名區分文件,為了方便記憶這裡我就以.sh為結尾
[root@xiaolyu ~]# vim first.sh
註釋:
#!/bin/bash 主要是為了聲明,我所寫的均為bash語言(我是用的是bash解釋器)
第二行為註釋行,註釋信息不生效
當寫一個比較大的腳本時,如果沒有一個好的註釋,那麼也就也就沒有人都能夠看懂其中的意思了
再往後即執行的命令。
執行過程:
[root@xiaolyu ~]# ll first.sh #查看是否具有執行許可權
-rw-r--r--. 1 root root 62 Aug 30 22:58 first.sh
[root@xiaolyu ~]# chmod +x first.sh #給腳本添加執行許可權
[root@xiaolyu ~]# ll first.sh #查看腳本是否具有執行許可權
-rwxr-xr-x. 1 root root 62 Aug 30 22:58 first.sh
[root@xiaolyu ~]# ./first.sh #執行腳本
執行的結果:
E-執行腳本的不同方式
第一種使用絕對路徑執行
第二種使用相對路徑執行,如./的方式
第三種使用 sh命令來執行 格式 sh 腳本名 不需要執行許可權 -x參數
第四種使用 . (空格)腳本名稱的方式執行 不需要執行許可權 . first.sh
第五種使用 source 腳本名稱 不需要執行許可權(主要用於生效配置文件)
#建議使用後三種,在生產環境中不要輕易的給文件可執行許可權;
二、 腳本中的變數。
變數的定義是:可以存放一個可變的值的空間
可以通過不同的環境進行改變就是一個可以變的值.
預設情況下: 在Linux中可以將每個shell看成不同的執行環境,所以相同的一個變數名稱在不同的變數執行環境中的變數值是不同的.
常見的shell變數分類:
自定義變數、環境變數、位置變數、預定義變數
變數的輸出
一般使用echo 輸出變數 echo $變數名
1.自定義變數
舉例1:來進行定義一個變數名字為Linux值為7.2
[root@xiaolyu ~]# Linux=7.2 #為變數Linux賦值
[root@xiaolyu ~]# echo $Linux #輸出變數Linux的值
7.2
[root@xiaolyu ~]# linux=6.5 #為變數linux賦值
[root@xiaolyu ~]# echo $linux #輸出變數linux的值
6.5
可以直接在命令行定義一個變數並賦予值,通過echo進行輸出變數 $是引用變數的特殊字元(必須使用$符號)
註意:echo和調用的變數之間必須要有空格。
大小寫的變數的值是不同的。
舉例2:當需要一起調用兩組變數時
[root@xiaolyu ~]# echo $Linux $linux
7.2 6.5
直接使用echo 後面跟$調用的變數 如果有多個則空格隔開
舉例3:當變數名和後面的字元容易混淆的時候應該使用{}將變數名括起來
[root@xiaolyu ~]# echo system${Linux}
system7.2
[root@xiaolyu ~]# echo ${Linux}system
7.2system
其他的特殊操作
雙引號( " ")
當=號右邊賦值出現空格的時候,需要使用雙引號將其擴起
[root@xiaolyu ~]# webserver="nginx 1.1"
[root@xiaolyu ~]# echo $webserver
nginx 1.1
#在雙引號的範圍內還可以引用其他的變數,從而能夠將現有的變數賦值給新的變數
[root@xiaolyu ~]# Linux=7.2
[root@xiaolyu ~]# system="RHEL$Linux"
[root@xiaolyu ~]# echo $system
RHEL7.2
[root@xiaolyu ~]#
單引號( ' ')
當要賦值的內容包括"$"、"\"等,具有其他含義的特殊字元時,應使用單引號將其括起來;
在單引號範圍內將無法引用其他的值,任何字元均作為普通字元看待,但賦值 的內容包含單引號時需要使用\’符號進行轉義以免衝突.
[root@xiaolyu ~]# kernel=3.10$Linux
[root@xiaolyu ~]# echo $kernel
3.107.2 #這個結果不是我們想要的,我們想要的結果是$3.10$Linux
[root@xiaolyu ~]# kernel='3.10$Linux'
[root@xiaolyu ~]# echo $kernel
3.10$Linux
[root@xiaolyu ~]#
反撇號( ` `)
位置在鍵盤esc的下邊的按鍵。
反撇號主要使用於命令替換,允許將某個命令的屏幕輸出結果賦值給變數。
舉例: 在命令行中查找程式的詳細的信息
[root@xiaolyu ~]# rpm -qf `which pwd`
coreutils-8.22-15.el7.x86_64
[root@xiaolyu ~]# rpm -qf $(which pwd)
coreutils-8.22-15.el7.x86_64
[root@xiaolyu ~]# which pwd
/usr/bin/pwd
[root@xiaolyu ~]# rpm -qf /usr/bin/pwd
coreutils-8.22-15.el7.x86_64
[root@xiaolyu ~]#
#反撇號括起來的範圍內必須是可執行的命令。否則將會出現錯誤
需要註意的是使用反撇號難以在一條命令中實現嵌套命令的操作,這是可以$()來替代反撇號
如果使用反撇號嵌套會出錯的!!
[root@xiaolyu ~]# rpm -q `rpm -qf `which pwd``
rpm: no arguments given for query
which-2.20-7.el7.x86_64
package pwd is not installed
建議使用$()的形式嵌套
[root@xuegod63 ~]# rpm -q $(rpm -qf $(which pwd))
coreutils-8.22-15.el7.x86_64
read命令
除了上面的賦值之外還可以使用read命令進行賦值,read命令用來提示用戶輸入信息,從而實現簡單的互動式過程(其實我們所輸入的命令就是一種互動式的過程)
執行時需要從標準輸入設備鍵盤讀取一行,並以空格為分隔符
[root@xiaolyu ~]# read kernel Linux #同時定義兩個變數操作
4.7.2 7.2 -->手動輸入的變數值
[root@xiaolyu ~]# echo $kernel
4.7.2
[root@xiaolyu ~]# echo $Linux
7.2
為了互動式更加的形象,提高易用性,加上 -p選項來設置提示信息
[root@xiaolyu ~]# read -p "input your password:" passwd #-p 指定提示信息
input your password:123456 #123456就是$passwd的值
[root@xiaolyu ~]# echo $passwd #輸出變數
123456
---------------------------------------------------------------------------------------------------------------
以上的操作只是在當前的bash環境下生效,到了其他控制台或者是其他shell就不能生效了
我們進入當前shell的子shell驗證:
[root@xiaolyu ~]# echo $Linux #在當前的shell環境輸出變數
7.2
[root@xiaolyu ~]# bash #切換子shell
[root@xiaolyu ~]# echo $Linux #在子shell環境輸出變數
#沒有輸出東西。
[root@xiaolyu ~]#
也可以先定義一個全局變數並賦值:
[root@xiaolyu ~]# export website=www.baidu.com #設置全局變數
[root@xiaolyu ~]# echo $website #在當前環境輸出變數
www.baidu.com
[root@xiaolyu ~]# bash #進入子shell
[root@xiaolyu ~]# echo $website #輸出子shell中的變數
www.baidu.com
[root@xiaolyu ~]#
需要註意的是變數的名是嚴格區分大小寫的
數值變數的運算:
shell腳本的數值運算多用於腳本程式的過程式控制制(如迴圈次數,使用量比較等)
在shell環境中,只能進行比較簡單的整數運算
運算符與變數之間必須有一個空各位,整數的運算主要是通過內部命令expr 命令進行運算。
格式 變數1 運算符 變數2
其中 變數1 、變數2 ……對應的需要計算的數值變數(需要$符號調用)常用的幾種運算符如下所示
加法運算:+
減法運算: -
乘法運算: \*
除法運算: /
求模(取餘)運算: %
若要將運算結果賦值給其他變數可以這麼做
2. 環境變數
環境變數是指系統本身運行需要由linux系統提前創建好的一類變數。
主要用於用戶的工作環境,包括(用戶的宿主目錄,命令的查找路徑,用戶的當前目錄,登錄的終端等)環境變數的值由操作系統本身自己維護,隨著用戶的狀態改變而改變
env調取當前環境變數