Przekaż parametry wiersza poleceń do programu w skrypcie powłoki


15

Jeśli chodzi o ./script.sh arg1 [arg2 arg3 ...]argumenty wiersza poleceń arg1, arg2... można dostać przez $1, $2... Ale liczba argumentów jest nie ustalone.

W skrypcie powłoki chcę przekazać argumenty zaczynające się od arg2do programu,

#/bin/bash
...
/path/to/a/program [I want to pass arg2 arg3 ... to the program]
...

Jak mogę to zrobić, skoro może istnieć jeden lub więcej argumentów?

Odpowiedzi:


17

Zwykłym sposobem byłoby zapisanie kopii arg1 ( "$1") i przesunięcie parametrów o jeden, aby można było odwołać się do całej listy jako "$@":

#!/bin/sh
arg1="$1"
shift 1
/path/to/a/program "$@"

bash ma oczywiście pewne wsparcie tablicowe, ale nie jest potrzebne do postawionego pytania.

Jeśli nawet arg1 jest opcjonalny, możesz to sprawdzić w następujący sposób:

if [ $# != 0 ]
then
    arg1="$1"
    shift 1
fi

Czy podwójne cudzysłowy są konieczne podczas korzystania $@?
Lee

1
Podwójne cudzysłowy z $@nakazuje powłoce podwójne zacytowanie każdego parametru (coś fajnego do zrobienia, jeśli parametry zawierają ciekawe znaki, takie jak nawiasy lub gwiazdki). Jeśli cię to nie obchodzi, zwykły $*działa ...
Thomas Dickey,

6
@Eeee Tak, konieczne są podwójne cudzysłowy. W przeciwnym razie, zamiast przechodzić przez listę argumentów, każdy argument jest dzielony w białych znakach, następnie każdy element jest interpretowany jako wzór wieloznaczny i, jeśli wzorzec pasuje, jest zastępowany przez listę dopasowań. Mówiąc ogólnie, zawsze podwojone podstawienia zmiennych .
Gilles „SO- przestań być zły”

10

Można pokroić parametry pozycyjne za pomocą rozszerzenia parametrów. Składnia jest następująca:

${parameter:offset:length}

Jeśli lengthzostanie pominięty, jest brany do ostatniej wartości.

Aby przejść z argumentów od drugiego do ostatniego, potrzebujesz:

${@:2}

Przykład:

$ foo() { echo "${@:2}" ;}

$ foo bar spam egg
spam egg
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.