有没有办法从 bash 函数内部获取脚本的位置参数?

有没有办法从 bash 函数内部获取脚本的位置参数?

以下变量用于获取位置参数:

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

但它们既可用于脚本的位置参数,也可用于函数的位置参数。

当我在函数内使用这些变量时,它们会为我提供函数的位置参数。

有没有办法从函数内部获取脚本的位置参数?

答案1

不,不是直接的,因为函数参数掩盖了它们。但在 Bash 或 ksh 中,您可以将脚本的参数分配给单独的数组,并使用它。

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

请注意,数组的编号从零开始,因此$1转到${ARGV[0]}等。

答案2

使用 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

答案3

"$@"作为 POSIX 可移植解决方案,有时,只需将原始参数添加到函数参数并在函数内移动参数可能是可行的:

#!/bin/sh
foo () {
  printf '%s-' "$@"
  printf '\n'
  # Save function parameters to custom variables
  x="$1"
  y="$2"
  z="$3"
  shift 3
  # At this point, "$@" regained its original value
  printf '%s-' "$x" "$y" "$z" "$@"
  printf '\n'
}
foo 1 2 3 "$@"

调用示例:

$ sh example.sh 4 5 6
1-2-3-4-5-6-
1-2-3-4-5-6-

答案4

在 shell 中使用shift命令,您可以访问所有位置参数,如下所示。参数向左移动并占据第一个位置。

while (( "$#" ))
do
  echo $1
  shift
done

相关内容