Jak przekazać parametry do innego polecenia w skrypcie bash?

165

W moim skrypcie bash chciałbym przeanalizować zero, jeden lub dwa parametry (skrypt może je rozpoznać), a następnie przekazać pozostałe parametry do polecenia wywołanego w skrypcie. Jak mogę to zrobić?

Łukasz Lew
źródło

Odpowiedzi:

239

Użyj shiftwbudowanego polecenia, aby „zjeść” argumenty. Następnie wywołaj proces potomny i przekaż mu "$@"argument, aby uwzględnić wszystkie pozostałe argumenty. Zwróć uwagę na cudzysłowy, należy je zachować, ponieważ powodują one rozszerzenie listy argumentów, aby były prawidłowo cytowane.

rozwijać
źródło
23
w rzeczywistości „$ @” jest bezpieczniejsze niż $ *
pixelbeat
1
@pixelbeat: Dzięki, dobry chwyt. Edytowałem. @ Łukasz Lew: patrz strona, do której prowadzi łącze w instrukcji. :) Zasadniczo lepiej radzi sobie z cytowaniem.
odpręż się
22
$@zasadniczo traktuje każdy element tablicy jako ciąg znaków w cudzysłowie - są one przekazywane bez możliwości rozwinięcia. Zapewnia również, że każde z nich jest postrzegane jako osobne słowo. To wyjaśnienie wraz ze skryptem testowym demonstrującym różnicę jest tutaj: tldp.org/LDP/abs/html/internalvariables.html#APPREF
Cascabel
2
Zwróć uwagę na cytaty! Przeczytaj więcej o tym, dlaczego są tak ważni tutaj: stackoverflow.com/a/4824637/4575793
Cadoiz
32

bash używa polecenia shift :

np. shifttest.sh:

#!/bin/bash
echo $1
shift
echo $1 $2

shifttest.sh 1 2 3 produkuje

1
2 3
Steve B.
źródło
2
@ TamásZahola chcesz wyjaśnić?
Kyle Chadha
2
Jeśli przekażesz argumenty $1bez cytowania ich jako "$1", to powłoka dokona podziału na słowa, więc np. foo barZostanie przekazana oddzielnie jako fooi bar.
Tamás Zahola
Przeczytaj więcej o tym, dlaczego ważne jest, aby mieć podwójne „w pobliżu”: stackoverflow.com/a/4824637/4575793
Cadoiz,
1
Mój mózg pomieszał kilka liter w „teście zmianowym” i konsekwentnie przeczytałem to jako coś innego.
Alex
21

Bash obsługuje podzbiory parametrów (zobacz Podzbiory i podciągi ), więc możesz wybrać, które parametry mają być przetwarzane / przekazywane w ten sposób.

  1. otwórz nowy plik i edytuj go: vim r.sh:

    echo "params only 2    : ${@:2:1}"
    echo "params 2 and 3   : ${@:2:2}"
    echo "params all from 2: ${@:2:99}"
    echo "params all from 2: ${@:2}"
  2. Uruchom:

    $ chmod u+x r.sh
    $ ./r.sh 1 2 3 4 5 6 7 8 9 10
  3. wynik to:

    params only 2    : 2
    params 2 and 3   : 2 3
    params all from 2: 2 3 4 5 6 7 8 9 10
    params all from 2: 2 3 4 5 6 7 8 9 10
Robert Lujo
źródło