Bash技巧:介紹 \$0、\$一、\$二、\$#、\$@、\$*、\$? 的含義

在編寫 Linux bash shell 腳本時,常常會用到 $0、$一、$二、$#、$@、$*、$? 等參數。下面具體說明這些參數的含義。git

假設執行 ./test.sh a b c 這樣一個命令,則能夠使用下面的參數來獲取一些值:shell

  • $0
    對應 ./test.sh 這個值。若是執行的是 ./work/test.sh, 則對應 ./work/test.sh 這個值,而不是隻返回文件名自己的部分。
  • $1
    會獲取到 a,即 $1 對應傳給腳本的第一個參數。
  • $2
    會獲取到 b,即 $2 對應傳給腳本的第二個參數。
  • $3
    會獲取到 c,即 $3 對應傳給腳本的第三個參數。$4$5 等參數的含義依此類推。
  • $#
    會獲取到 3,對應傳入腳本的參數個數,統計的參數不包括 $0
  • $@
    會獲取到 "a" "b" "c",也就是全部參數的列表,不包括 $0
  • $*
    也會獲取到 "a" "b" "c", 其值和 $@ 相同。但 "$*""$@" 有所不一樣。
    "$*" 把全部參數合併成一個字符串,而 "$@" 會獲得一個字符串參數數組。
  • $?
    能夠獲取到執行 ./test.sh a b c 命令後的返回值。
    在執行一個前臺命令後,能夠當即用 $? 獲取到該命令的返回值。
    該命令能夠是系統自身的命令,能夠是 shell 腳本,也能夠是自定義的 bash 函數。

當執行系統自身的命令時,$? 對應這個命令的返回值。
當執行 shell 腳本時,$? 對應該腳本調用 exit 命令返回的值。若是沒有主動調用 exit 命令,默認返回爲 0。
當執行自定義的 bash 函數時,$? 對應該函數調用 return 命令返回的值。若是沒有主動調用 return 命令,默認返回爲 0。數組

下面舉例說明 "$*""$@" 的差別。假設有一個 testparams.sh 腳本,內容以下:bash

#!/bin/bash

for arg in "$*"; do
    echo "****:" $arg
done
echo --------------
for arg in "$@"; do
    echo "@@@@:" $arg
done

這個腳本分別遍歷 "$*""$@" 擴展後的內容,並打印出來。函數

執行 ./testparams.sh 腳本,結果以下:ui

$ ./testparams.sh This is a test
****: This is a test
--------------
@@@@: This
@@@@: is
@@@@: a
@@@@: test

能夠看到,"$*" 只產生一個字符串,for 循環只遍歷一次。
"$@" 產生了多個字符串,for 循環遍歷屢次,是一個字符串參數數組。命令行

注意:若是傳入的參數多於 9 個,則不能使用 $10 來引用第 10 個參數,而是要用 ${10} 來引用。code

即,須要用大括號{}把大於 9 的數字括起來。
例如,${10} 表示獲取第 10 個參數的值,寫爲 $10 獲取不到第 10 個參數的值。
實際上,$10 至關於 ${1}0,也就是先獲取 $1 的值,後面再跟上 0。
若是 $1 的值是 "first",則 $10 的值是 "first0"。ci

查看 man bash 裏面對位置參數(positional parameters)的說明以下:字符串

Positional Parameters
A positional parameter is a parameter denoted by one or more digits, other than the single digit 0.

Positional parameters are assigned from the shell's arguments when it is invoked, and may be reassigned using the set builtin command.
Positional parameters may not be assigned to with assignment statements.
The positional parameters are temporarily replaced when a shell function is executed.

When a positional parameter consisting of more than a single digit is expanded, it must be enclosed in braces.

即,最後一句提到,當位置參數由多位數字組成時,須要用大括號{}把多位數字括起來。

獲取位置參數的個數

在 bash 中,能夠使用 $# 來獲取傳入的命令行或者傳入函數的參數個數。
要注意的是,$# 統計的參數個數不包括腳本自身名稱或者函數名稱。
例如,執行 ./a.sh a b,則 $# 是 2,而不是 3。

查看 man bash 的說明以下:

Special Parameters
# Expands to the number of positional parameters in decimal.

能夠看到,$# 其實是擴展爲位置參數(positional parameters)的個數,統計的參數不包括 $0

相關文章
相關標籤/搜索