Shell腳本應用(1)
Shell:是一個特殊的應用程序,它介於操作系統內核與用戶之間,充當了一個“命令解釋器”的角色,負責接收用戶的操作指令(命令)並進行解釋,將需要執行的操作傳遞給內核執行,並輸出執行結果
常見的shell解釋器程序有很多,使用不同的shell時,其內部指令,命令行提示等方面會存在一些差別,我們通過cat /etc/shells文件,現在來查看一下
這些都是當前系統中的shell種類。其中/bin/bash是目前大多數linux版本採用的默認shell,Bash的全稱爲Bourne Again Shell。是最受歡迎的開源軟件項目之一。
創建一個shell腳本,大致分爲以下三步
1.理清任務過程
2.整理執行語句
3.完善任務結構
下面我們舉個例子,來使用shell腳本創建一個用戶
//現在就寫完了,這是一個簡單的創建用戶的腳本。
下面執行腳本的方式:(三種)
1、./useradd.sh//直接打開 ----(因爲我們剛創建的腳本,是沒有執行權限的,在執行之前,需要給這個腳本一個執行權限。Chmod +x useradd.sh)chmod +x 相當於 chmod a+x
2.sh useradd.sh或 . useradd.sh//不需要爲腳本添加執行權限
3.source useradd.sh//這種跟上面兩種不一樣。例如,我們在腳本中寫了:
#!/bin/bash
cd /home
ll –lh
那麼。使用source useradd.sh。執行這個腳本的時候,就真的會進入 home路徑下,而不是在當前目錄
重定向操作
標準輸入(stdin)。默認的設備是鍵盤。文件編號爲0,命令將從標準輸入文件中讀取在執行過程中的數據。
標準輸出(stdout):默認的設備是顯示器,文件編號爲1,命令將執行後的輸出結果發送到標準輸出文件
標準錯誤(stdout):默認的設備是顯示器,文件編號爲2,命令將執行期間的各種錯誤信息發送到標準錯誤文件
(1)重定向輸出:重定向輸出指的是將命令的正常輸出結果保存到指定的文件中,而不是直接顯示在顯示器的屏幕
包括:>或>>,分別用戶覆蓋和追加文件。若重定向輸出的目標文件不存在,則會新建該文件,然後將前面命令的輸出結果保存到該文件中
例如
若需要保留源文件的內容。需要使用>>
(2)重定向輸入:重定向輸入指的是將命令中接收輸入的途徑由默認的鍵盤改爲指定的文件,而不是等待從鍵盤輸入
使用 < 符號
例如
第一個是將“123456“輸入到passwd.txt文件中。
然後更改user1的密碼。從passwd.txt文件中提取
(3)錯誤重定向:錯誤重定向指的是將執行命令過程中出現的錯誤信息(如選項或參數錯誤等)保存到指定的文件,而不是直接顯示在屏幕上。錯誤重定向使用2> 操作符,其中2是錯誤文件的編號(在使用標準輸出,標準輸入時,實際上省略了0.1編號)
例如
不會將錯誤信息輸出到屏幕,而是保存到error.txt文件中
使用2>> 也是不覆蓋源文件,在末尾追加。
使用shell變量。
常見的shell變量的類型包括自定義變量,環境變量,預定義變量,位置變量
1.自定義變量
自定義變量是由系統用戶自己定義的變量,只在用戶自己的shell環境中有效,因此成爲本地變量。
基本格式爲:變量名=變量值。等號兩邊沒有空格、變量名稱需要以字母或下劃線開頭,名稱中不要包含特殊字符(如+ - * / . ? % $ # &等)
例如
2.查看和引用變量的值
通過在變量名稱前添加$,可以引用一個變量的值,使用echo命令可以查看變量。可以在一條echo命令中同時查看多個變量值。
例:
當變量名稱容易和緊跟其後的其他字符相混淆時,需要添加大括號{}將其包起來,否則將無法確定正確的變量名稱,對於未定義的變量,將顯示空值。
例如
3,變量賦值的特殊操作。
在等號“=”後邊直接指定變量內容是爲變量賦值的基本方法,除此以外,還有一些特殊的賦值操作
(1)雙引號“”
雙引號主要起一個界定字符串的作用,特別是當要賦值的內容中包含空格時,必須以雙引號括起來,其他情況下可以省略
例如:
在雙引號範圍內,使用$符號可以引用其他變量的值(變量引用),從而能夠直接調用現有變量的值來賦值給新的變量。
例如
(2)單引號‘’
當要賦值的內容中包括$,” /等具有特殊含義的字符時,應使用單引號括起來。在單引號的範圍內,將無法引用其他變量的值,任何字符均作爲普通字符看待,但賦值內容中包含單引號時,需要使用“\”符號進行轉義,以免衝突
(3)反撇號
反撇號主要用於命令替換,允許將執行某個命令的屏幕輸出結果賦值給變量,反撇號括起來的範圍內必須是能夠執行的命令行,否則將會出錯、
連續執行了兩條命令---先通過which useradd 命令查找useradd命令的程序位置,然後根據查找結果列出文件屬性,執行過程中,會將which useradd 命令的輸出結果替換整個反撇號範圍
可以給命令賦值
將uname –r的輸出結果給aa
(4)read命令
除了上述賦值以外,還可以使用Bash的內置命令read來給變量賦值,read命令用來提示用戶輸入信息,從而實現簡單的交互過程,執行時將從標註輸入設備(鍵盤)讀入一行內容,並以空格爲分隔符,將讀入的各字段挨個賦值給指定的變量(多餘的內容賦值給最後一個變量)。若指定的變量只有一個,則將整行內容賦值給此變量。
例如
爲了使交互式操作的界面更加友好,提高易用性,read命令可以結合“-p”選項來設置提示信息,以便告知用戶應該輸入什麼內容等相關事項。
例如
4.設置變量的作用範圍
默認情況下,新定義的變量只在當前的shell環境中有效,因此稱爲局部變量,當進入子程序或新的子shell環境時,局部變量將無法使用。當進入一個新的子shell環境中,將無法引用父級shell環境中定義的nian變量
例如
爲了使用戶定義的變量在所有的子shell環境中能夠繼續使用,減少重複設置工作,可以通過內部命令export將指定的變量導出爲“全局變量”可以同時制定多個變量名作爲參數(不需使用$符號)變量名之間用空格分隔
在使用export導出全局變量的同時,也可以爲變量進行賦值,這樣在新定義全局變量時就不需要提前進行賦值了。
例如
5.數值變量的運算
整數運算操作
使用expr命令,計算表達式
格式:expr 變量1 運算符變量2
運算符:+ - \* / %
例:expr 1 + 1注意:在算乘法*的時候,需要轉義一下例:expr 1\*2(因爲*表示通配符)
若要將運算結果賦值給其他變量,可以結合命令替換操作(使用反撇號)例如,計算變量Y的3次方,並將結果賦值給變量aa
使用$[]表達式,算式替換
echo $[1+1]
2
echo $[1-1]
0
echo $[1*2] (算乘法的時候,不用再加\)
2
echo $[1/2]
0.5
echo $[1%2]
x=1;y=2
echo [y-x]
特殊的shell變量
1環境變量
環境變量指的是出於運行需要而由linux系統提前創建的一類變量、
使用env可以查看到當前工作環境下的環境變量
例如
USER:用戶名稱
HOME:用戶宿主目錄
LANG:語言和字符集
PWD:當前所在的工作目錄
PATH:命令搜索路徑
PATH變量用於設置可執行程序的默認搜索路徑,當僅指定文件名稱來執行命令程序時,linux系統將在PATH變量指定目錄範圍查找對應的可執行文件,如果找不到則會提示“command not found”例如,firsh.sh腳本位於/root/目錄下,若希望直接通過文件名稱來運行腳本,可以修改PATH變量以添加搜索路徑,或者將firsh.sh複製到現有搜索路徑中的某個文件夾下
當有了root路徑,直接執行即可
在linux系統中,環境變量的全局配置文件爲/etc/profile。在此文件中定義的變量作用於所有用戶,除此以外,每個用戶還有自己的獨立配置文件(~/.bash_profile)
歷史命令保存的條數是1000條
更改爲200條
打開環境變量文件
找到 HISSIZE
改爲200即可
2.位置變量。
位置變量也稱爲位置參數,使用$1~$9表示。
下面編寫一個小腳本,來說明一下
第1個位置變量是1,用$1表示。第2個是2,用$2表示
3.預定義變量
預定義變量是由Bash程序預先定義好的一類特殊變量,用戶只能使用預定義變量,而不能創建新的預定義變量,也不能直接爲預定義變量賦值。較常用的幾個預定義變量如下:
由系統或腳本操作,不可直接賦值
$?:前一條命令的狀態,0表示正常,非0表示不正常
$0:腳本自身的程序名
$1~$9:第1-第9個位置參數
$*:命令行的所有位置參數
$#:命令行的位置參數個數
爲了說明預定義變量的作用,下面編寫一個備份操作的小腳本,用來打包命令行指定的多個文件和或目錄,並輸出詳細信息。其中,新建的壓縮包文件名稱嵌入秒刻(從1970年1月1日至今經過的秒數)通過date +%s獲取
執行一下:
請看下節shell腳本應用(2)