Wie leite ich Parameter an andere Befehle im Bash-Skript weiter?

165

In meinem Bash-Skript möchte ich null, einen oder zwei Parameter analysieren (das Skript kann sie erkennen) und dann die verbleibenden Parameter an einen im Skript aufgerufenen Befehl weiterleiten. Wie kann ich das machen?

Łukasz Lew
quelle

Antworten:

239

Verwenden Sie den shiftintegrierten Befehl, um die Argumente zu "essen". Rufen Sie dann den untergeordneten Prozess auf und übergeben Sie ihm das "$@"Argument, um alle verbleibenden Argumente einzuschließen. Beachten Sie die Anführungszeichen, sie sollten beibehalten werden, da sie dazu führen, dass die Erweiterung der Argumentliste ordnungsgemäß in Anführungszeichen gesetzt wird.

entspannen
quelle
23
Tatsächlich
1
@ Pixelbeat: Danke, guter Fang. Ich habe bearbeitet. @ Łukasz Lew: siehe die verlinkte Seite im Handbuch. :) Grundsätzlich geht es besser mit Zitieren um.
Entspannen Sie
22
$@behandelt im Wesentlichen jedes Element des Arrays als Zeichenfolge in Anführungszeichen - sie werden ohne Erweiterungsmöglichkeit weitergegeben. Es stellt auch sicher, dass jedes als separates Wort gesehen wird. Diese Erklärung zusammen mit einem Testskript
Cascabel
2
Achten Sie auf Anführungszeichen! Lesen Sie hier mehr darüber, warum es wichtig ist: stackoverflow.com/a/4824637/4575793
Cadoiz
32

bash verwendet den Befehl shift :

zB shifttest.sh:

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

shifttest.sh 1 2 3 erzeugt

1
2 3
Steve B.
quelle
2
@ TamásZahola willst du das erklären?
Kyle Chadha
2
Wenn Sie die Argumente als weiterleiten, $1ohne sie als zu zitieren "$1", führt die Shell eine Wortaufteilung durch, sodass z. B. foo barals foound barseparat weitergeleitet wird.
Tamás Zahola
Lesen Sie hier mehr darüber, warum es wichtig ist, das Doppelte zu haben: stackoverflow.com/a/4824637/4575793
Cadoiz
1
Mein Gehirn hat im "Schichttest" ein paar Buchstaben durcheinander gebracht und ich habe es folglich als etwas anderes gelesen.
Alex
21

Bash unterstützt Teilmengenparameter (siehe Teilmengen und Teilzeichenfolgen ), sodass Sie auswählen können, welche Parameter wie folgt verarbeitet / übergeben werden sollen.

  1. öffne neue Datei und bearbeite sie: 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. starte es:

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

    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
quelle