1. 程式人生 > 其它 >Shell 程式設計規範與環境變數

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
    #!/usr/bin/expect
  • 註釋資訊:以“#”開頭的語句表示為註釋資訊,被註釋的語句在執行指令碼時不會被執行
  • 可執行語句:比如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"