Linux Shell指令碼系列之二

tiu5發表於2017-09-30
  • shell是幹嘛用的?
    shell是一指令碼語言,沒有編譯過程,不像Java等其他程式語言一樣複雜,它面向的物件應該是伺服器,為了運維人員方便管理伺服器而去實現某些操作。而不是說用shell去寫一個app,它沒這個能耐。

shell變數

  • 變數是任何一門程式語言不可少的組成部分,它用於儲存資料。
  • 通常指令碼語言不需要宣告變數的型別,直接賦值就可以了。
  • 而在Bash中,變數的預設賦值都是一個字串,無論你賦值的時候有沒有加上引號,它都是當作字串去儲存。
  • 變數名不能以數字開頭,可以由數字字母下劃線組成。
變數的分類
  • 使用者自定義的變數
    變數名=變數值(給變數賦值時,不要有空格,不然系統會一個你是在輸入命名,所以會報命令找不到的錯誤)
    $變數名或${變數名}:呼叫變數值
    set:檢視當前已定義的變數
    set -u:可以知道呼叫變數值時可以知道該變數是為空還是未定義
    unset:用於刪除變數
    sum=$var+$x按道理應該輸出10,結果輸出的是5+5,這是因為變數賦值都當作是字串,所以下面才有sum=$var$x輸出55

舉個例子1
舉個例子1

  • 系統環境變數:主要儲存和系統操作環境相關的資料,可自定義,但真正對系統生效的變數和作用是固定的。
    環境變數和使用者自定義變數的區別,環境變數是全域性變數,使用者自定義變數是區域性變數
    定義環境變數:
    export 變數名=變數值 (宣告並賦值)
    變數名=變數值
    export 變數名 (先賦值後宣告)
    env:只檢視環境變數用命令
    $PATH:系統查詢命令的路徑
    其實我們平時使用的命令,按道理都是需要打路徑下的可執行檔案去執行的,但我們都不會這樣去使用。
    比如說ls命令,按道理應該是/bin/ls可是我們只是使用ls就成功執行了該檔案,為什麼呢?
    這是因為環境變數$PATH的作用,當我們打出ls時,它會在$PATH裡頭儲存的路徑下去找對應的可執行檔案
    那麼按照這個思路,我們可以把存放自己寫的指令碼那個檔案目錄放到$PATH裡頭,那麼我們就可以很輕鬆的去呼叫了

舉個例子2
舉個例子2

locale:查詢當前系統的語系
LANG:定義系統主語系的變數,修改該值只是臨時生效
/etc/sysconfig/i18n:修改這個檔案重啟伺服器後永久生效

  • 預定義變數:變數名和該變數對於的作用都是固定的,不可自定義,位置引數變數也是預定義變數的一種
    1.位置引數變數
    $n:n為數字,$0代表命令本身,$1-$9代表1到9的引數列表,大於或等於10的用用花括號包起來{$10}
    $*:代表命令列中的所有引數,把所有引數看作一個整體
    $@:代表命令列中的所有引數,把每個引數區分看待
    $#:代表命令列中的所有引數個數

利用位置引數變數寫一個求和指令碼
利用位置引數變數寫一個求和指令碼

求和可以使用let命令,如let sum=var1+var2
也可以使用(()),如sum=$((var1+var2)) 或 $(($var1+$var2))
使用操作符[]也可以這樣sum=$[$var1+var2]
$*$@的區別
$*被擴充套件為$1c$2c$3等,其中c為IFS的第一個字元
$@被擴充套件為$1 $2 $3

舉個例子4
舉個例子4

$*看成一個整體,所以只迴圈了一次。$@把每個引數區分看待,所以迴圈了4次
2.預定義變數
$?:最後一次執行命令的返回狀態,0為正確執行,非0為錯誤執行
$$:當前程式的程式號 (PID)
$!:後臺執行的最後一個程式的程式號

read變數:接收鍵盤輸入
  • -p:提示資訊,等待輸入時的提示資訊
  • -t:指導等待輸入時間
  • -n:指定接收的字元長度
  • -s:隱藏輸入內容,適用於密碼輸入之類,比如我們輸入登入密碼,輸入時你是看不到你輸入了什麼

舉個例子5
舉個例子5

相關文章