2017-04-27 1 views
1

anderen Parameter des Befehls WrappingBash - Wrapping einen anderen Befehl der Parameter

Ich habe einen Befehl tool1, die Argumente auf diese Weise analysiert:

#!/usr/bin/env bash 
# ... 
while [[ $# -ge 1 ]] 
do 
     key="$1" 
     case $key in 
       -o|--option) 
       OPT="$2" 
       shift 
       ;; 

       -u|--user) 
       USR="$2" 
       shift 
       ;; 

       -*) 
       echo -e "Unrecognized option: \"$key\"" && exit 1 
       ;; 

       *) 
       OTHERS+=("$1") 
       ;; 
     esac 
     shift 
done 
# ... 

ich tool2 haben, die tool1 nennt. Daher muss tool2 Parameter an tool1 übergeben werden. nur durch tool2

#!/usr/bin/env bash 
# ... 
while [[ $# -ge 1 ]] 
do 
     key="$1" 
     case $key in 
       -O|--option2) 
       opt2="$2" 
       shift 
       ;; 

       -u|--user) 
       USR="$2" 
       OTHERS+=("-u $2") 
       shift 
       ;; 

       -*) 
       echo -e "Unrecognized option: \"$key\"" && exit 1 
       ;; 
       *) 
       OTHERS+=("$1") 
       ;; 
     esac 
     shift 
done 

## Call tool1 with other parameters to pass 
bash tool1.sh ${OTHERS[@]} 
# ... 

Zusammengefasst --option2 ist eine Option verwendet: Es kann auch die gleichen Parameter (--user)

tool2 aussieht verarbeiten müssen. --user ist beiden Tools gemeinsam und wird möglicherweise auch von verwendet, bevor tool1.sh aufgerufen wird. Aus diesem Grund muss in diesem Beispiel --user explizit an tool1 dank dem Array OTHERS übergeben werden.

Ich würde gerne über mögliche und/oder alternative Möglichkeiten im Umgang mit solchen Parameter Redundanzen wissen. Eine Methode, die mir helfen würde, die erwarteten Parameter/Optionen eines anderen Tools zu umhüllen, ohne die Zeilen in Bezug auf das Parsen solcher redundanter Parameter/Optionen kopieren/einfügen zu müssen.

+0

Warum benutzen Sie 'getopt' nicht? – jehutyy

+0

Für Portabilitätsprobleme. 'getopt' ist nicht standardisiert. 'getopts' unterstützt jedoch keine langen Optionen. – kaligne

+0

Was ist, wenn eine Option im zweiten Skript ist, aber nicht im ersten? Auch wenn beide Skripte auf einen Parameter einwirken können, wie ist es redundant? – 123

Antwort

1

tool2 's Ansatz ist in Ordnung. Sie setzen OTHERS jedoch nicht korrekt.

-u|--user) 
    USR="$2" 
    OTHERS+=("-u" "$2") 
    shift 

-u und ihr Argument Notwendigkeit, separate Array-Elemente zu bleiben, so wie sie getrennte Argumente tool2 waren. Sie müssen auch die Erweiterung der OTHERS, zitieren Argumente zu wahren Wortspalt Zeichen oder Klümpchen enthalten:

bash tool1.sh "${OTHERS[@]}" 

Schließlich werden alle Großbuchstaben-Variablennamen für die Verwendung durch die Shell reserviert sind selbst; definiere solche Namen nicht selbst. Verwenden Sie einfach others anstelle von OTHERS.

+0

Danke für die Einsicht. Die Großschreibung von Namen für exportierte Variablen ist in Ordnung, oder? – kaligne

+0

Wenn Sie "groß schreiben", meinen Sie "Andere", sicher. Erstellen Sie jedoch keine Variablen, die ausschließlich aus Großbuchstaben bestehen. Ob Sie die Variable exportieren oder nicht, spielt keine Rolle. – chepner

+0

OK Ursache in einigen offiziellen Dokumentation Ich habe gelesen, dass die Deklaration der persönlichen Großbuchstaben Variable (OTHER) ist nur relevant, wenn die genannten Variablen exportiert werden. – kaligne

Verwandte Themen