Bash

在函式定義中使用位置參數

  • September 4, 2019

如何在函式聲明中使用位置參數(從命令行給出)?

在函式定義中, $ 1 and $ 2 是函式本身的唯一位置參數,而不是全域位置參數!

呼叫者作用域的位置參數在函式中不可用。您需要呼叫者以一種或另一種方式將它們傳遞給函式。

bash中,這可以通過數組來完成(但請注意,除"$@"in之外的數組bash從索引 0 而不是 1 開始(與 in 類似ksh,但與所有其他 shell 相反))。

f() {
 printf 'Caller $1: %s\n' "${caller_argv[0]}"
 printf '    My $1: %s\n' "$1"
}
caller_argv=("$@")
f blah

或者另外傳遞它們:

f() {
 printf 'Caller $1: %s\n' "$2"
 shift "$(($1 + 1))"
 printf 'My $1: %s\n' "$1"
}

f "$#" "$@" blah

這裡$1包含呼叫者的位置參數的數量,所以f知道它自己的參數從哪裡開始。

使用 bash,您可以使用 shell 變數 BASH_ARGV

shopt -s extdebug
# create the array BASH_ARGV with the parameter of the script
shopt -u extdebug
# No more need of extdebug but BASH_ARGV is created

f() {
 printf 'Caller $1: %s\n' ${BASH_ARGV[$((${#BASH_ARGV[*]}-1))]}
 printf '    My $1: %s\n' "$1"
}
f blah

引用自:https://unix.stackexchange.com/questions/429211