405 Stimmen

Wie man in der Bash Argumente mit Flags bekommt

Ich weiß, dass ich leicht positionierte Parameter wie diese in Bash erhalten kann:

$0 ou $1

Ich möchte Flag-Optionen wie diese verwenden können, um anzugeben, wofür die einzelnen Parameter verwendet werden:

mysql -u user -h host

Was ist der beste Weg, um an -u param Wert und -h param Wert nach Flagge statt nach Position?

684voto

Dennis Punkte 51330

Dieses Beispiel verwendet die in der Bash eingebaute getopts Befehl und stammt aus dem Google Shell Style Guide :

a_flag=''
b_flag=''
files=''
verbose='false'

print_usage() {
  printf "Usage: ..."
}

while getopts 'abf:v' flag; do
  case "${flag}" in
    a) a_flag='true' ;;
    b) b_flag='true' ;;
    f) files="${OPTARG}" ;;
    v) verbose='true' ;;
    *) print_usage
       exit 1 ;;
  esac
done

Hinweis: Wenn ein Zeichen von einem Doppelpunkt gefolgt wird (z. B. f: ), wird erwartet, dass diese Option ein Argument hat.

Beispiel für die Verwendung: ./script -v -a -b -f filename

Die Verwendung von getopts hat mehrere Vorteile gegenüber der üblichen Antwort:

  • die while-Bedingung ist viel besser lesbar und zeigt, welche Optionen akzeptiert werden
  • sauberer Code; kein Zählen der Anzahl der Parameter und Verschieben
  • können Sie Optionen verbinden (z. B. -a -b -c -abc )

Ein großer Nachteil ist jedoch, dass es keine langen Optionen unterstützt, sondern nur Optionen mit einem Zeichen.

398voto

Flexo Punkte 84571

Das ist die Redewendung, die ich normalerweise verwende:

while test $# -gt 0; do
  case "$1" in
    -h|--help)
      echo "$package - attempt to capture frames"
      echo " "
      echo "$package [options] application [arguments]"
      echo " "
      echo "options:"
      echo "-h, --help                show brief help"
      echo "-a, --action=ACTION       specify an action to use"
      echo "-o, --output-dir=DIR      specify a directory to store output in"
      exit 0
      ;;
    -a)
      shift
      if test $# -gt 0; then
        export PROCESS=$1
      else
        echo "no process specified"
        exit 1
      fi
      shift
      ;;
    --action*)
      export PROCESS=`echo $1 | sed -e 's/^[^=]*=//g'`
      shift
      ;;
    -o)
      shift
      if test $# -gt 0; then
        export OUTPUT=$1
      else
        echo "no output dir specified"
        exit 1
      fi
      shift
      ;;
    --output-dir*)
      export OUTPUT=`echo $1 | sed -e 's/^[^=]*=//g'`
      shift
      ;;
    *)
      break
      ;;
  esac
done

Die wichtigsten Punkte sind:

  • $# ist die Anzahl der Argumente
  • Die while-Schleife prüft alle übergebenen Argumente und gleicht ihre Werte innerhalb einer case-Anweisung ab.
  • Die Schicht nimmt die erste weg. Sie können innerhalb einer case-Anweisung mehrfach verschieben, um mehrere Werte zu übernehmen.

53voto

Shizzmo Punkte 15411

Getopt ist Ihr Freund.. ein einfaches Beispiel:

function f () {
TEMP=`getopt --long -o "u:h:" "$@"`
eval set -- "$TEMP"
while true ; do
    case "$1" in
        -u )
            user=$2
            shift 2
        ;;
        -h )
            host=$2
            shift 2
        ;;
        *)
            break
        ;;
    esac 
done;

echo "user = $user, host = $host"
}

f -u myself -h some_host

In Ihrem /usr/bin-Verzeichnis sollten sich verschiedene Beispiele befinden.

38voto

pijemcolu Punkte 1916

Ich schlage ein einfaches TLDR:; Beispiel für die Unkundigen vor.

Erstellen Sie ein Bash-Skript namens greeter.sh

#!/bin/bash

while getopts "n:" arg; do
  case $arg in
    n) Name=$OPTARG;;
  esac
done

echo "Hello $Name!"

Sie können dann einen optionalen Parameter übergeben -n wenn das Skript ausgeführt wird.

Führen Sie das Skript als solches aus:

$ bash greeter.sh -n 'Bob'

Ausgabe

$ Hello Bob!

Anmerkungen

Wenn Sie mehrere Parameter verwenden möchten:

  1. erweitern. while getops "n:" arg: do mit weiteren Parametern wie while getops "n:o:p:" arg: do
  2. den Fallschalter mit zusätzlichen Variablenzuweisungen erweitern. Wie zum Beispiel o) Option=$OPTARG y p) Parameter=$OPTARG

Um das Skript ausführbar zu machen:

chmod u+x greeter.sh

18voto

Matias Barrios Punkte 4078

Ich denke, dies wäre ein einfacheres Beispiel für das, was Sie erreichen wollen. Es besteht keine Notwendigkeit, externe Werkzeuge zu verwenden. Die in der Bash integrierten Werkzeuge können diese Aufgabe für Sie erledigen.

function DOSOMETHING {

   while test $# -gt 0; do
           case "$1" in
                -first)
                    shift
                    first_argument=$1
                    shift
                    ;;
                -last)
                    shift
                    last_argument=$1
                    shift
                    ;;
                *)
                   echo "$1 is not a recognized flag!"
                   return 1;
                   ;;
          esac
  done  

  echo "First argument : $first_argument";
  echo "Last argument : $last_argument";
 }

Dadurch können Sie Flags verwenden, so dass Sie unabhängig von der Reihenfolge der Parameterübergabe das richtige Verhalten erhalten.

Beispiel:

 DOSOMETHING -last "Adios" -first "Hola"

Ausgang :

 First argument : Hola
 Last argument : Adios

Sie können diese Funktion zu Ihrem Profil hinzufügen oder in ein Skript einbauen.

Danke!

Bearbeiten: Speichern Sie dies als Datei und führen Sie es dann als yourfile.sh -last "Adios" -first "Hola"

#!/bin/bash
while test $# -gt 0; do
           case "$1" in
                -first)
                    shift
                    first_argument=$1
                    shift
                    ;;
                -last)
                    shift
                    last_argument=$1
                    shift
                    ;;
                *)
                   echo "$1 is not a recognized flag!"
                   return 1;
                   ;;
          esac
  done  

  echo "First argument : $first_argument";
  echo "Last argument : $last_argument";

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X