1. 在終端機螢幕上顯示文字、變數內容,或將訊息輸出到檔案中
echo "Hello World"
2. 定義變數
<variable name>=<data>
規則:
a. 等號前後,不能有空格
b. 變數名稱只能是英文和數字,且數字不能在開頭
c. 變數內容,如需空白,可放在雙引號 "" 或是單引號 '' 裡面
-雙引號中若有特殊字元,例如 $,會保有原本的特性。
-單引號中所有的字元即為一般字元,沒有任何功能 。
d. 反斜線 \, 可以跳脫其後接的第一個字元本身的功能
3. 取得變數內容
$<variable name>
${<variable name>}
4. 指令內容,可以使用 $(command) 或是 `command` 取得其他指令的值。
username=$(whoami)
echo $username
user
5. 取消變數設定
unset username
6. 取得所有環境變數
env
7. 自訂變數轉成環境變數
export <variable name>
8. 查看目前開放哪些環境變數
export
9. 列出所有的變數:自訂變數,環境變數,bash 本身變數
set
10. 語系相關
a. 查看目前語系變數:locale
b. 查看支援哪些語系:locale -a
c. 暫時修改語系的變數:export LANG=zh_TW.utf8
只要有設定 LANG 或是 LC_ALL,則其他的變數就會被這兩個變數自動取代。
d. 永久修改語系的變數:打開 /etc/locale.conf, 加入或更改:LANG="en_US.utf-8"
11. 讀取鍵盤輸入,當作變數值
read <option> <variable name>
option :
-a : array,變數為陣列格式,以空白隔開,依序存入陣列中,索引從0開始。
-p : prompt,跳出提示字串。
-t : timeout,設定秒數內沒有完成則結束。
12. 宣告變數的類型,沒指定,預設為字串。只有整數才可運算。
declare <option> <variable name>
option :
-a : 變數為陣列格式,以空白隔開,依序存入陣列中,索引從0開始。
-i : 整數類型,可以進行數值運算,但是預設只能做到整數型態。
-l : 將變數內容轉換為小寫。
-r : 變數僅為 readonly,不可被更改也不可以被 unset。
-u : 將變數內容轉換為大寫。
-x : 開放變數轉換成環境變數,等同使用 export。
13. 比較符號:
字串比較符號:
=:等於(字串相等)
!=:不等於(字串不相等)
<:小於(按字典序比較)
>:大於(按字典序比較)
-z:檢查字串是否為空(長度為零)
-n:檢查字串是否非空(長度大於零)
數字比較符號:
-eq:等於(數字相等)
-ne:不等於(數字不相等)
-lt:小於(數字小於)
-le:小於或等於(數字小於或等於)
-gt:大於(數字大於)
-ge:大於或等於(數字大於或等於)
14. 檔案測試符號:
-e FILE:如果 FILE 存在,則為真。
-f FILE:如果 FILE 存在且為一個檔案,則為真。
-d FILE:如果 FILE 存在且為一個目錄,則為真。
-s FILE:如果 FILE 存在且檔案大小不為零,則為真。
-r FILE:如果 FILE 存在且可讀取(有讀取權限),則為真。
-w FILE:如果 FILE 存在且可寫入(有寫入權限),則為真。
-x FILE:如果 FILE 存在且可執行(有執行權限),則為真。
-L FILE:如果 FILE 存在且為一個符號連結(軟連結),則為真。
-p FILE:如果 FILE 存在且為一個命名管道(FIFO),則為真。
-c FILE:如果 FILE 存在且為一個字元特殊文件,則為真。
15. 流程控制:
a. if, then else fi
if 條件
then
# 如果條件為True,執行這裡的命令
else
# 如果條件為False,執行這裡的命令
fi
b. if … elif … fi
if 條件1
then
# 如果條件1為真,執行這裡的命令
elif 條件2
then
# 如果條件2為真,執行這裡的命令
else
# 如果以上所有條件都不滿足,執行這裡的命令
fi
c. case
case 值 in
條件1)
條件1匹配時執行的命令
;;
條件2)
條件2匹配時執行的命令
;;
*)
沒有任何匹配時執行的命令
;;
esac
d. for
for 變數 in 列表; do
執行的命令
done
e. while
while 條件
do
# 當條件為真時執行的程式碼
done
16. 函式(Function)結構:
function 函式名稱 {
# 函式的程式碼
# 可以使用傳遞給函式的參數
# 函式的操作
# ...
# 返回值(可選)
}
17. 結果輸出導向:
a. >(複寫導向)
echo "Hello" > output.txt
b. >>(附加導向):將指令的標準輸出以附加(Append)的方式存入檔案。它不會刪除舊資料,而是將新資料寫在檔案的最末端。
echo "Hello" >> output.txt
c. &>(全輸出導向):標準輸出(stdout)和標準錯誤輸出(stderr)「同時」存入同一個檔案中。無論指令執行成功還是發生錯誤,所有的訊息都會被寫進檔案(並採覆寫模式)。&> 與較傳統的寫法 > 檔案名稱 2>&1 效果完全相同。)
echo "Hello" &> output.txt
d. 2>&1 :將標準錯誤輸出(stderr,代號 2)重新導向至標準輸出(stdout,代號 1)
在 Linux 與 Bash 中,每個執行中的程式都有預設的資料流代號:
0:標準輸入(stdin,鍵盤輸入)
1:標準輸出(stdout,正常顯示的訊息)
2:標準錯誤(stderr,錯誤或警告訊息)
18. 管線命令 (pipe):管線命令使用『 | 』,上一個指令輸出,給下一個指令使用。
例:ls -al /etc | less
ls 指令輸出後的內容,給 less 讀取
19. Shell Script基本結構元素:
1. Shebang行:通常以#! 開頭後面接著一個解釋器(interpreter)的路徑,用來告訴系統使用哪種shell來執行script,系統會自動使用指定的解釋器執行script。
#!/bin/bash
2. 註釋:使用 # 符號來添加註釋。註釋不會被執行僅供備註閱讀。
# 這是一個註釋
3. 變數:
variable="Hello World!"
4. 特殊變數:
$0, ${BASH_SOURCE[0]}:這個變數代表目前shellscript程式的檔案名稱(包括路徑)。
$1, $2, ... $n:用於獲取命令行參數傳遞給程式的值。$1代表第一個參數,$2代表第二個參數,依此類推,$n代表第n個參數。
5. 特殊的環境變數
$HOME:代表當前的主目錄路徑,通常用於訪問家目錄。
$USER:代表當前使用者名。
$PWD:代表當前工作目錄的路徑。
$SHELL:代表當前所使用的Shell的路徑。
$PATH:包含了Shell用於查詢可執行命令的目錄列表。
6. 指令:
echo "This is a shell script."
7. 流程控制:(如 if、else、case)和迴圈(如 for、while)來執行流程控制
if [ $age -ge 18 ]; then
echo "You are an adult."
else
echo "You are not yet an adult."
fi
8. 函數:函數能夠接受參數與返回值。
function afunc {
echo "Hello, $1!"
}
afunc "Alice"
參考網站:
Shell 的變數設定
Shell Script 基礎介紹