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?

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.



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

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
    
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.