Bash

有沒有辦法從bash的函式內部獲取腳本的位置參數?

  • April 18, 2020

以下變數用於獲取位置參數:

$1, $2, $3, etc.
$@
$#

但它們用於腳本的位置參數和函式的位置參數。

當我在函式中使用這些變數時,它們會給我函式的位置參數。

有沒有辦法從函式內部獲取腳本的位置參數?

不,不是直接的,因為函式參數掩蓋了它們。但是在 Bash 或 ksh 中,您可以將腳本的參數分配給單獨的數組,然後使用它。

#!/bin/bash
ARGV=("$@")
foo() {
    echo "number of args: ${#ARGV[@]}"
    echo "second arg: ${ARGV[1]}"
}
foo x y z 

請注意,數組的編號從零開始,$1等等${ARGV[0]}

使用 bash 獲取腳本參數的另一種方法是使用 Shell 變數 BASH_ARGC 和 BASH_ARGV

#!/bin/bash
shopt -s extdebug
test(){
 echo 'number of element in the current bash execution call stack = '"${#BASH_ARGC[*]}"
 echo 'the script come with '"${BASH_ARGC[$((${#BASH_ARGC[*]}-1))]}"' parameter(s)'
 echo 'the first is '"${BASH_ARGV[$((${#BASH_ARGV[*]}-1))]}"
 echo 'there is 2 way to get the parameters of this function'
 echo 'the first is to get $1,...,$n'
 echo '$1 = '"$1"
 echo '$2 = '"$2"
 echo 'the second with the use of BASH_ARGC and BASH_ARGV'
 echo 'this function '"${FUNCNAME[0]}"' come with '"${BASH_ARGC[0]}"' parameter(s)'
 echo 'the second is '"${BASH_ARGV[0]}"
 echo 'the first is '"${BASH_ARGV[1]}"
}
essai(){
 test paramtest1 "$3"
}
essai paramessai1 paramessai2 paramessai3

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