Jak przekazać wszystkie argumenty przekazane do mojego skryptu bash do mojej funkcji?

Powiedzmy, że zdefiniowałem function abc(), który będzie obsługiwał całą logikę związaną z analizą argumentów przekazywanych do mojego skryptu.

Jak mogę przekazać do niego wszystkie argumenty, które otrzymał skrypt bash? Liczba paramów jest zmienna, więc nie mogę po prostu zakodować argumentów przekazywanych w ten sposób:

abc $1 $2 $3 $4

Edit . Jeszcze lepiej, czy jest jakiś sposób, aby moja funkcja miała dostęp do zmiennych argumentów skryptu?

Author: Paulo Mattos, 2010-09-28

6 answers

Pet peeve: gdy używasz $@, powinieneś (prawie) zawsze umieszczać go w cudzysłowach, aby uniknąć mylenia argumentów ze spacjami:

abc "$@"
 686
Author: Gordon Davisson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-28 20:24:18

Potrzebowałem wariacji na ten temat, która spodziewam się, że będzie przydatna dla innych:

function diffs() {
        diff "${@:3}" <(sort "$1") <(sort "$2")
}

Część "${@:3}" oznacza wszystkie elementy tablicy zaczynające się od 3. Tak więc ta funkcja implementuje posortowane rozróżnienie, przekazując dwa pierwsze argumenty do diff poprzez sort, a następnie przekazując wszystkie inne argumenty do diff, więc możesz wywołać go podobnie do diff:

diffs file1 file2 [other diff args, e.g. -y]
 117
Author: hajamie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-17 16:05:27

Użyj zmiennej $@, która rozszerza się na wszystkie parametry wiersza poleceń oddzielone spacjami.

abc "$@"
 45
Author: Mia Clarke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-29 17:51:56

Oto prosty skrypt:

#!/bin/bash

args=("$@")

echo Number of arguments: $#
echo 1st argument: ${args[0]}
echo 2nd argument: ${args[1]}

$# jest liczbą argumentów otrzymanych przez skrypt. Łatwiej jest uzyskać do nich dostęp za pomocą tablicy: linia args=("$@") umieszcza wszystkie argumenty w tablicy args. Aby uzyskać do nich dostęp, użyj ${args[index]}.

 39
Author: Giuseppe Cardone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-10 12:44:23

Warto wspomnieć, że za pomocą tej składni można określić zakresy argumentów.

function example() {
    echo "line1 ${@:1:1}"; #First argument
    echo "line2 ${@:2:1}"; #Second argument
    echo "line3 ${@:3}"; #Third argument onwards
}
Nie widziałem, żeby o tym wspominano.
 24
Author: robstarbuck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-22 23:24:43
abc "$@"

$@ reprezentuje wszystkie parametry podane do skryptu bash.

 15
Author: Vivien Barousse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-09 10:09:32