介紹如何在 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
版本相同。