Gibt es eine Möglichkeit, die Positionsparameter des Skripts aus einer Funktion in bash heraus abzurufen?

8

Die folgenden Variablen werden verwendet, um die Positionsparameter abzurufen:

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

Sie werden jedoch sowohl für Positionsparameter des Skripts als auch für Positionsparameter einer Funktion verwendet.

Wenn ich diese Variablen innerhalb einer Funktion verwende, geben sie mir die Positionsparameter der Funktion.

Gibt es eine Möglichkeit, die Positionsparameter des Skripts aus einer Funktion heraus abzurufen?

user271680
quelle

Antworten:

10

Nein, nicht direkt, da die Funktionsparameter sie maskieren. In Bash oder ksh können Sie die Argumente des Skripts jedoch einfach einem separaten Array zuweisen und dieses verwenden.

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

Beachten Sie, dass die Nummerierung für das Array bei Null beginnt, also $1zu ${ARGV[0]}usw. geht .

ilkkachu
quelle
1
Beachten Sie, dass Sie Folgendes verwenden, wenn Sie Argumente einschließlich $ 0 oder mit einer Nummer benötigen, die der Nummerierung der Positionsargumente entspricht ARGV=( "$0" "$@" ).
Isaac
6

Eine andere Möglichkeit, den Parameter des Skripts mit bash abzurufen, besteht darin, die Shell-Variablen BASH_ARGC und BASH_ARGV zu verwenden

#!/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
ctac_
quelle
0

Als tragbare POSIX-Lösung kann es manchmal sinnvoll sein, nur das Original "$@"zu den Funktionsargumenten hinzuzufügen und die Parameter innerhalb der Funktion zu verschieben:

#!/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 "$@"

Beispielaufruf:

$ sh example.sh 4 5 6
1-2-3-4-5-6-
1-2-3-4-5-6-
Feinfuß
quelle
-2

Mit dem Shift-Befehl in der Shell können Sie wie unten gezeigt auf alle Positionsparameter zugreifen. Die Parameter werden nach links verschoben und nehmen die erste Position ein

while (("$ #")) gibt die 1-Dollar-Verschiebung wieder

Yabrasu
quelle