Übergeben Sie Befehlszeilenparameter an ein Programm innerhalb des Shell-Skripts


15

Was ./script.sh arg1 [arg2 arg3 ...], die Befehlszeilenargumente arg1, arg2kann ... bekommen werden durch $1, $2... Aber die Anzahl der Argumente ist nicht festgelegt.

Im Shell-Skript möchte ich die Argumente beginnend mit arg2an ein Programm übergeben,

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

Wie könnte ich das machen, da es ein oder mehrere Argumente geben könnte?

Antworten:


17

Der übliche Weg wäre, eine Kopie von arg1 ( "$1") zu speichern und die Parameter um eins zu verschieben, sodass Sie sich auf die gesamte Liste beziehen können als "$@":

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

Bash hat natürlich einige Array-Unterstützung, aber es wird für die gestellte Frage nicht benötigt.

Wenn sogar arg1 optional ist, würden Sie dies folgendermaßen überprüfen:

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

Sind bei der Verwendung doppelte Anführungszeichen erforderlich $@?
Lee

1
Die doppelten Anführungszeichen mit $@weisen die Shell an, jeden Parameter in Anführungszeichen zu setzen (was zu tun ist, wenn die Parameter interessante Zeichen wie Klammern oder Sternchen enthalten). Wenn Sie sich nicht darum kümmern, $*funktioniert eine Ebene ...
Thomas Dickey

6
@Lee Ja, die doppelten Anführungszeichen sind erforderlich. Ansonsten wird, anstatt die Liste der Argumente zu durchlaufen, jedes Argument in Leerzeichen aufgeteilt, und jedes Stück wird als Platzhaltermuster interpretiert. Wenn das Muster übereinstimmt, wird es durch die Liste der Übereinstimmungen ersetzt. Generell immer doppelte Anführungszeichen bei Variablensubstitutionen .
Gilles 'SO - hör auf böse zu sein'

10

Sie können die Positionsparameter mit Hilfe der Parametererweiterung aufteilen. Die Syntax lautet:

${parameter:offset:length}

Wenn lengthweggelassen, wird der Wert bis zum letzten Wert übernommen.

Da Sie vom zweiten bis zum letzten Argument übergehen sollten, benötigen Sie:

${@:2}

Beispiel:

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

$ foo bar spam egg
spam egg
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.