/ / Dostęp do argumentów do skryptu Bash wewnątrz funkcji [duplikat] - bash

Uzyskaj dostęp do argumentów skryptu Bash wewnątrz funkcji [duplicate] - bash

Wewnątrz funkcji $1 ... $n są parametrami przekazanymi do tej funkcji. Poza funkcją $1 ... $n są parametrami przekazanymi do skryptu.

Czy mogę w jakiś sposób uzyskać dostęp do parametrów przekazanych do skryptu wewnątrz funkcji?

Odpowiedzi:

21 dla odpowiedzi № 1

Zwykle przekazujesz je jako parametry do funkcji w czasie połączenia.

Alternatywą (brzydszą) jest umieszczenie ich w zmiennych globalnych.


17 dla odpowiedzi nr 2

(Wiem, że to stary post, ale żadna z odpowiedzi nie odpowiedziała na pytanie).

Użyj tablicy BASH_ARGV. Zawiera argumenty przekazane do skryptu wywołującego w odwrotnej kolejności (tzn. Jest to stos ze szczytem o indeksie 0). Może być konieczne włączenie rozszerzonego debugowania w shebang (np. #!/bin/bash -O extdebug) lub z shopt (na przykład., shopt -s extdebug), ale działa dla mnie w bash 4.2_p37 bez jego włączenia.

Od man bash:

Zmienna tablicowa zawierająca wszystkieparametry w bieżącym stosie wywołań wykonywania basha. Ostatni parametr ostatniego wywołania podprogramu znajduje się na szczycie stosu; pierwszy parametr pierwszego połączenia znajduje się na dole. Gdy podprogram jest wykonywany, dostarczane parametry są wypychane na BASH_ARGV. Powłoka ustawia BASH_ARGV tylko w trybie rozszerzonego debugowania….

Oto funkcja, której używam do drukowania wszystkich argumentów w jednej linii:

# Print the arguments of the calling script, in order.
function get_script_args
{
# Get the number of arguments passed to this script.
# (The BASH_ARGV array does not include $0.)
local n=${#BASH_ARGV[@]}

if (( $n > 0 ))
then
# Get the last index of the args in BASH_ARGV.
local n_index=$(( $n - 1 ))

# Loop through the indexes from largest to smallest.
for i in $(seq ${n_index} -1 0)
do
# Print a space if necessary.
if (( $i < $n_index ))
then
echo -n " "
fi

# Print the actual argument.
echo -n "${BASH_ARGV[$i]}"
done

# Print a newline.
echo
fi
}

11 dla odpowiedzi nr 3

Jak stwierdził Benoit, najprostszym rozwiązaniem jest przekazanie argumentów linii poleceń do funkcji jako argumentów funkcji z $@, następnie możesz odwoływać się do nich dokładnie w ten sam sposóbsposób na zewnątrz funkcji. W rzeczywistości będziesz odwoływać się do wartości przekazywanych do funkcji, które po prostu mają taką samą wartość jak argumenty linii poleceń, pamiętaj o tym.

Zauważ, że to bardzo ci uniemożliwiaprzekazywanie do argumentu innych argumentów, chyba że wiesz dokładnie, ile argumentów zostanie przekazanych w wierszu poleceń (mało prawdopodobne, ponieważ zależy to od użytkownika i nie jest ograniczony przez ograniczenia)

to znaczy

    function fname {
# do something with $1 $2 $3...$n #
}

# $@ represents all the arguments passed at the command line #
fname $@

Lepszym sposobem jest przekazanie tylko argumentów, o których wiesz, że będziesz używał, w ten sposób możesz użyć ich w funkcji I także przekazać inne parametry z kodu, jeśli chcesz

to znaczy

    function fname {
# do something with $1 $count $2 and $3 #
}

count=1
fname $1 $count $2 $3

6 dla odpowiedzi № 4

Możesz przechowywać wszystkie swoje argumenty skryptu w globalnej tablicy:

args=("$@")

a następnie uzyskaj do nich dostęp za pomocą funkcji:

f(){
echo ${args[0]} ${args[1]}
}

3 dla odpowiedzi № 5

Powinieneś prawdopodobnie używać "$@" i przekazać to na końcu listy argumentów funkcji. Wewnątrz funkcji, shift po przeanalizowaniu argumentów i użyciu $1 do $n jak zwykle.


0 dla odpowiedzi № 6

Dzięki za wskazówki - zainspirowali mnie do napisania funkcji callstack. Użyłem polecenia „kolumna” dla estetyki.

callstack() {
local j=0 k prog=$(basename $0)
for ((i=1; ((i<${#BASH_ARGC[*]})); i++))
do
echo -n "${FUNCNAME[$i]/main/$prog} " # function name
args=""
for ((k=0; ((k<${BASH_ARGC[$i]})); k++))
do
args="${BASH_ARGV[$j]} $args" # arguments
let j++
done
echo -e "$argst|${BASH_LINENO[$i]}" $(sed -n ${BASH_LINENO[$i]}p "$0" 2>/dev/null) # line calling the function
done | column -t -s $"t" -o " " | sed 1d # delete callstack entry
}
porównajTemplates brother_001270_1.jpg | 163 compareTemplates "$ f" # przetwarzaj resztę processPdf brother_001270.pdf | 233 filetype "$ {f% [*}" pdf && processPdf "$ f" proces brother_001270.pdf | 371 - proces) zmiana; proces „$ @”; wyjście ;; # przetwarzaj jpg lub pdf sm --quiet --process brother_001270.pdf | 0