Shell 程式設計規範與環境變數
1. Shell
2.Shell程式設計規範
3. 重定向與管道操作
4. Shell變數的作用、型別
5. 特殊的Shell變數
1. Shell
最常用的就是bash、tcsh、 csh、sh、 nologin這些shell。這些shell都是依據Linux發展者的不同所創造出的不同版本。
- bash:基準於GNU的框架下發展出的Shell
- csh: 語法有點類似於c語言的Shell
- tcsh:整合了csh,提供更多的功能
- sh:已經被bash所替換
- nologin: 奇怪的shell,這個shell可以讓使用者無法登入主機
- 注: bash ( /bin/bash) 是目前大多數Linux版本採用的預設Shell
登入shell
- 登入後預設使用的shell程式,一般為/bin/bash
- 不同的shell的內部指令、執行環境等會有所區別
shell指令碼
- 將要執行的命令按順序儲存到一個文字檔案
- 給該檔案可執行許可權
- 可結合各種shell控制語句以完成更復雜的操作
shell指令碼應用場景
- 重複性操作
- 互動性任務
- 批量事務處理
- 服務執行狀態監控
- 定時任務執行
2.Shell程式設計規範
編寫指令碼程式碼
- 使用vi或者vim編輯器,一般都是使用vim編輯器
- 每行一條Linux命令,按執行順序一次編寫
1 vim abc.sh #使用vim編輯器2 3 #!/bin/bash #指令碼直譯器宣告 4 5 # this is a test. #註釋 6 7 cd /boot 8 9 echo 當前目錄位於: 10 11 pwd
- 指令碼申明(直譯器):若第一行為“#!/bin/bash”,表示此行以下的程式碼語句是通過/bin/bash程式來解釋執行,#!/bin/bash為預設直譯器。還有其它型別的直譯器,比如#!/usr/bin/python
- 註釋資訊:以“#”開頭的語句表示為註釋資訊,被註釋的語句在執行指令碼時不會被執行。
- 可執行語句:比如echo命令,用於輸出" "之間的字串
shell指令碼的執行
方法一:指定路徑的命令,要求檔案必須有 x(可執行)許可權。
1 chmod +x abc.sh #給指令碼新增可執行許可權 2 3 /root/abc.sh #指定絕對路徑 4 5 ./abc.sh #指定相對路徑
方法二:指定shell來解釋指令碼,不要求檔案必須有 x (可執行)許可權。
1 sh 指令碼路徑:sh abc.sh 2 3 source 指令碼路徑:. abc.sh 或者 source abc.sh
3. 重定向與管道操作
互動式硬體裝置
標準輸入:從該裝置接收使用者輸入的資料
標準輸出:通過該裝置向用戶輸出資料
標準錯誤:通過該裝置報告執行出錯資訊
型別 | 裝置檔案 | 檔案描述編號 | 預設裝置 |
---|---|---|---|
標準輸入 | /dev/stdin | 0 | 鍵盤 |
標準輸出 | /dev/stdout | 1 | 顯示器 |
標準錯誤輸出 | /dev/stderr | 2 | 顯示器 |
重定向操作
型別 | 操作符 | 用途 |
重定向輸入 | < | 從指定的檔案讀取資料,而不是從鍵盤輸入 |
重定向輸出 | > | 將輸出結果儲存到指定的檔案(覆蓋原有內容) |
>> | 將輸出結果追加到指定的檔案尾部 | |
標準錯誤輸出 | 2> | 將錯誤資訊儲存到指定的檔案(覆蓋原有內容) |
2>> | 將錯誤資訊追加到指定的檔案中 | |
混合輸出 | &> | 將標準輸出、標準錯誤的內容儲存到同一個檔案中 |
4. Shell變數的作用、型別
變數是會變化的值,不會變化的是常量
變數的作用
- 用來存放系統和使用者需要使用的特定引數(值)
- 變數名:使用固定的名稱,由系統預設或使用者定義
- 變數值:能夠根據使用者設定、系統環境的變化而變化
變數的型別
- 自定義變數:由使用者自己定義、修改和使用
- 特殊變數:環境變數、只讀變數、位置變數、預定義變數
自定義變數
1 變數名=變數值 #變數名以字母或下劃線開頭,區分大小寫,建議全大寫 2 3 echo $變數名 #檢視變數的值
注:
等號(=)用來給變數賦值
等號(=)運算子左邊是一個變數名,等號(=)運算子右邊是儲存在變數中的值
賦值時使用引號
雙引號:允許通過$符號引用其他變數值
單引號:禁止引用其他變數值,$視為普通字元
反撇號:命令替換,提取命令執行後的輸出結果,``和$( )作用相同
鍵盤輸入內容為變數賦值
read命令獲取輸入內容
1 read -p 提示資訊 變數名 2 echo $變數名
在指令碼中編寫,在命令列實現read獲取
1 vim name.sh 2 #!/bin/bash 3 read -p “請輸入你的名字” name 4 echo "--------" 5 read -p “請輸入他的名字” hername 6 echo "--------" 7 echo "你的名字是" 8 echo $name 9 echo "她的名字是" 10 echo $hername
設定變數的作用範圍
可以使用 pstree 命令檢視Shell環境,輸入 bash 命令進入子Shell環境,
按Ctrl+D組合鍵或輸入 exit 命令退出子Shell環境。
預設情況下,新定義的變數只在當前的Shell環境中有效,因此稱為區域性變數。當進入子程式或新的子Shell環境時,區域性變數將無法再使用。
可以通過內部命令export將指定的變數匯出為全域性變數,使使用者定義的變數在所有的子Shell環境中能夠繼續使用。
1 格式1:export 變數名 2 格式2:export 變數名=變數值
整數變數的運算
運算子:+ 加法、- 減法、* 乘法、/ 除法、% 取餘
常用的運算表示式:
1 i=$(expr 12 \* 5) 2 i=$((10 * 5)) 3 i=$[10 * 4] 4 let i=10*3 5 6 i++ 相當於 i=$[$i+1] 7 i-- 相當於 i=$[$i-1] 8 i+=2 相當於 i=$[$i+2]
5. 特殊的Shell變數
環境變數
由系統提前建立,用來設定使用者的工作環境
配置檔案:/etc/profile(全域性生效)、~/.bash_profile(當前使用者環境)
常見環境變數
PWD、PATH
USER、SHELL、HOME
使用 env 命令可以檢視到當前工作環境下的環境變數
變數USER表示使用者名稱稱,HOME表示使用者的宿主目錄,LANG表示語言和字符集,PWD表示當前所在的工作目錄,變數PATH表示可執行程式的預設搜尋路徑。
PATH(路徑環境變數)
設定系統根據環境變數自動設定可執行程式
1 echo $PATH #檢視當前搜尋路徑 2 PATH="$PATH:/root" #將/root目錄新增到搜尋路徑 3 export PATH="$PATH:/root" #輸出為全域性環境變數 4 5 設定永久有效: 6 echo 'export PATH=$PATH:/root' >> /etc/profile #將全域性環境變數追加到/etc/profile中
只讀變數
用於變數值不允許被修改的情況,readonly命令用於定義只讀shell變數和shell函式。readonly命令的選項-p可以輸出顯示系統中所有定義的只讀變數。
位置變數
當執行命令列操作時,第一個欄位表示命令名或指令碼程式名,其餘的字串引數按照從左到右的順序依次賦值給位置變數。
$n“n”為數字,$0代表命令本身,$1- $9代表帶一個到第九個引數,十以上的引數需要使用大括號表示,比如第十個引數為${10}。
預定義變數
$* 和 $@:都會表示命令或指令碼要處理的引數
$*:把所有引數看成以空格分隔的一個字串整體(單字串)返回,代表"$1 $2 $3 $4 "
$@:把各個引數加上雙引號分隔成n份的引數列表,每個引數作為一個字串返回,代表“$1” “$2” “$3” “$4”
預定義變數 | 表示的意思 |
---|---|
$0 | 表示當前執行的指令碼或命令的名稱 |
$# | 表示命令或者指令碼要處理的引數的個數 |
$? | 表示前一條命令或指令碼執行後的返回狀態碼,返回值為0表示執行正確,返回任何非0值均表示執行出現異常,也常被用於shell指令碼中return退出函式並返回的退儲值 |
bash不支援浮點運算,如果需要進行浮點運算,需要藉助bc, awk 處理
1 #!/bin/bash 2 #加 3 f=$(echo "4.3+2.5"|bc) 4 echo "4.3+2.5=$f" 5 6 #減 7 f=$(echo "4.3-2.5"|bc) 8 echo "4.3-2.5-$f" 9 10 #乘 11 f=$(echo "4.30*2.50"|bc) 12 echo "4.3*2.5-$f" 13 14 #除 15 f=$(echo "scale=2;4.3/2.5"|bc) 16 echo "4.3/2.5-$f" 17 18 #混合運算 19 f=$(echo "2.2/(2.2-1.1)*2+1.1"|bc) 20 echo "2.2/(2.2-1.1)*2+1.1=$f"