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 № 1Zwykle 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