- shell是幹嘛用的?
shell是一指令碼語言,沒有編譯過程,不像Java等其他程式語言一樣複雜,它面向的物件應該是伺服器,為了運維人員方便管理伺服器而去實現某些操作。而不是說用shell去寫一個app,它沒這個能耐。
shell變數
- 變數是任何一門程式語言不可少的組成部分,它用於儲存資料。
- 通常指令碼語言不需要宣告變數的型別,直接賦值就可以了。
- 而在Bash中,變數的預設賦值都是一個字串,無論你賦值的時候有沒有加上引號,它都是當作字串去儲存。
- 變數名不能以數字開頭,可以由數字字母下劃線組成。
變數的分類
- 使用者自定義的變數
變數名=變數值
(給變數賦值時,不要有空格,不然系統會一個你是在輸入命名,所以會報命令找不到的錯誤)$變數名或${變數名}
:呼叫變數值set
:檢視當前已定義的變數set -u
:可以知道呼叫變數值時可以知道該變數是為空還是未定義unset
:用於刪除變數sum=$var+$x
按道理應該輸出10,結果輸出的是5+5,這是因為變數賦值都當作是字串,所以下面才有sum=$var$x
輸出55
- 系統環境變數:主要儲存和系統操作環境相關的資料,可自定義,但真正對系統生效的變數和作用是固定的。
環境變數和使用者自定義變數的區別,環境變數是全域性變數,使用者自定義變數是區域性變數
定義環境變數:export 變數名=變數值
(宣告並賦值)變數名=變數值
export 變數名
(先賦值後宣告)env
:只檢視環境變數用命令$PATH
:系統查詢命令的路徑
其實我們平時使用的命令,按道理都是需要打路徑下的可執行檔案去執行的,但我們都不會這樣去使用。
比如說ls
命令,按道理應該是/bin/ls
可是我們只是使用ls
就成功執行了該檔案,為什麼呢?
這是因為環境變數$PATH
的作用,當我們打出ls
時,它會在$PATH
裡頭儲存的路徑下去找對應的可執行檔案
那麼按照這個思路,我們可以把存放自己寫的指令碼那個檔案目錄放到$PATH
裡頭,那麼我們就可以很輕鬆的去呼叫了
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次
2.預定義變數
$?
:最後一次執行命令的返回狀態,0為正確執行,非0為錯誤執行$$
:當前程式的程式號 (PID)$!
:後臺執行的最後一個程式的程式號
read變數:接收鍵盤輸入
- -p:提示資訊,等待輸入時的提示資訊
- -t:指導等待輸入時間
- -n:指定接收的字元長度
- -s:隱藏輸入內容,適用於密碼輸入之類,比如我們輸入登入密碼,輸入時你是看不到你輸入了什麼