shell 指令碼 - 基礎知識及變數學習
一、什麼是shell?
shell是一種指令碼語言,shell可以利用命令解釋功能,來解釋使用者輸入的命令,並且將其傳遞給核心;還可以呼叫其他程式,給其他程式傳遞資料或引數,並獲取程式的處理結果;在多個程式之間傳遞資料,把一個程式的輸出作為另一個程式的輸入;shell本身也可以被其他程式呼叫。
二、shell的種類
/bin/sh /bin/bash /bin/ksh /bin/tcsh /bin/csh /bin/zsh
三、shell指令碼編寫
- 建立一個*.sh指令碼
# 檔名:name.sh #! /bin/bash echo "你來自哪裡?" read ADDRESS echo "我來自:$ADDRESS"
- 作為可執行程式
chmod+x name.sh ./name.sh

#!
是一個約定的標記,它告訴系統這個指令碼需要什麼直譯器來執行,即使用哪一種Shell
read
讀取輸入,並將值賦給變數 ADDRESS
中
chmod +x
使指令碼具有執行許可權
四、shell 語法學習
1. 變數
- 變數名必須為數字
- 必須是以字母或者下劃線開頭
- 不能使用shell中的關鍵字
- 定義變數及賦值
# value是變數,shanxi是給變數賦的值,如果值中不包含空格,可以不用加引號 value=shanxi value='shanxi' value="shanxi"
注意:
1. ' '
包圍變數的值時,單引號裡面是什麼就輸出什麼,即使內容中有變數和命令也會把它們原樣輸出
2. " "
包圍變數的值時,輸出時會先解析裡面的變數和命令,而不是把雙引號中的變數名和命令原樣輸出
3.推薦給所有變數加上花括號{ },這是個良好的程式設計習慣。
# 例子 #! /bin/bash author=小明 echo "當前作者: $author" author=小花 echo "更換後的作者:${author}"

- 將命令的結果賦值給變數
Shell 也支援將命令的執行結果賦值給變數,常見的有以下兩種方式:
value=`命令` variable=$(命令)

- 只讀變數
使用 readonly 命令可以將變數定義為只讀變數,只讀變數的值不能被改變。
#無法改變只讀變數的值 #! /bin/bash name="xiaoming" readonly name name="mhh"

-
刪除變數
使用 unset 命令可以刪除變數
#! /bin/sh name = "xiaoming" unset name echo ${name} ~

2.特殊變數
變數 | 含義 |
---|---|
$0 |
當前指令碼的檔名 |
$n |
傳遞給指令碼或函式的引數。n 是一個數字,表示第幾個引數。例如,第一個引數是 $1 ,第二個引數是 $2 。 |
$# |
傳遞給指令碼或函式的引數個數。 |
$* |
傳遞給指令碼或函式的所有引數。 |
$@ |
傳遞給指令碼或函式的所有引數。被雙引號(" ")包含時,與 $* 稍有不同,下面將會講到。 |
$? |
上個命令的退出狀態,或函式的返回值。 |
$$ |
當前Shell程序ID。對於 Shell 指令碼,就是這些指令碼所在的程序ID。 |
#! /bin/sh echo "姓名: $0" echo "引數1: $1" echo "引數1: $2" echo "所有引數: $@" echo "所有: $*" echo "引數個數: $*"

注意:
不被雙引號( " "
)包含時:
$*
輸出:
"$1" "$2" … "$n"
$@
輸出:
"$1" "$2" … "$n"
被雙引號( " "
)包含時:
$*
輸出:
"$1 $2 … $n"
$@
輸出: "$1" "$2" … "$n"