介紹如何在 Bash 指令稿中透過 $#、$*、$@、$1、$2、$3 等特殊變數取得命令列的參數個數與內容。
在一般的程式語言中,都可以透過 argc 與 argv 這類的特殊變數來取得命令列中指定的參數個數與內容,而在 Bash 指令稿中對應的特殊變數則為 $#、$* 與 $@,以下是這些變數的使用方式。
$# 取得命令列參數個數在 Bash 中對應 argc 的變數為 $#,以下是使用範例:
#!/bin/bash # 命令列參數個數(對應 argc) echo "參數個數:$#"
假設此指令稿名稱為 script.sh,則實際執行的狀況如下:
bash script.sh dog cat
參數個數:2
實務上在指令稿的開頭會先檢查參數的數量是否正確,若參數的數量有誤,則顯示錯誤訊息以及使用說明等資訊,以下是一個簡單的範例:
#!/bin/bash # 設定命令列參數個數 ARG_NUM=2 # 檢查參數個數 if [ $# -ne $ARG_NUM ]; then echo "參數個數錯誤:$#" echo "參數個數應為:$ARG_NUM" exit 1 fi echo "參數個數正確,執行後續動作..."
假設此指令稿名稱為 argnum.sh,則實際執行的狀況如下:
bash argnum.sh dog
參數個數錯誤:1 參數個數應為 2
bash argnum.sh dog cat
參數個數正確,執行後續動作...
$* 與 $@ 取得命令列參數內容若需要取得執行 Bash 指令稿時所指定的參數內容,可以透過 $* 或 $@ 變數,這兩個變數都可以用來取得各個參數的內容,但有一些差異:
$*:單一字串,由所有參數以空白串接而成。$@:陣列,包含所有參數。$* 在串接各個參數時,事實上是以 $IFS 變數的第一個字元作為分隔字元,而 $IFS 變數的預設值是空白字元。由於 $* 是將所有參數串接成一個字串,當參數內容包含空白時,可能會造成參數內容的混淆,因此通常建議是使用 $@ 來取用各個參數。
#!/bin/bash # 逐一處理各參數 for a in "$@"; do echo "<$a>"; done
假設此指令稿名稱為 arg.sh,則實際執行的狀況如下:
bash script.sh dog cat bird fish
<dog> <cat> <bird> <fish>
若參數內容包含空白,以 $@ 的方式也能正確處理:
bash script.sh dog "cat bird" fish
<dog> <cat bird> <fish>
$1、$2、$3… 取得命令列參數內容Bash 的 $1、$2、$3 這些特殊數字變數可以用來直接取得指定參數的內容,以下是使用範例:
#!/bin/bash echo "第 1 個參數:$1" echo "第 2 個參數:$2" echo "第 3 個參數:$3"
假設此指令稿名稱為 arg2.sh,則實際執行的狀況如下:
bash script.sh dog cat bird
第 1 個參數:dog 第 2 個參數:cat 第 3 個參數:bird
while 逐一處理各參數若要逐一處理各個參數,除了使用 for 迴圈之外,亦可使用 while 迴圈搭配 shift,每處理完第一個參數後,將處理完的第一個參數移除,直到所有參數都處理完為止:
#!/bin/bash # 逐一處理各參數 while [ $# != 0 ]; do echo "<$1>"; # 印出目前的第一個參數 shift # 將目前的第一個參數移除 done
這個 while 版本的指令稿執行的結果跟 for 版本相同。