1158 Stimmen

Wie man über Argumente in einem Bash-Skript iteriert

Ich habe einen komplexen Befehl, aus dem ich ein Shell/Bash-Skript erstellen möchte. Ich kann es schreiben in Form von $1 leicht:

foo $1 args -o $1.ext

Ich möchte mehrere Eingaben an das Skript übergeben können. Was ist der richtige Weg, dies zu tun?

Und natürlich möchte ich Dateinamen mit Leerzeichen darin behandeln.

26voto

Iceberg Punkte 1720

Schleife gegen $#, die Variable für die Anzahl der Argumente, funktioniert auch.

#! /bin/bash

for ((i=1; i<=$#; i++))
do
  printf "${!i}\n"
done

test.sh 1 2 '3 4'

Ausfluss:

1
2
3 4

9voto

Rich Kadel Punkte 105

Wenn Sie die Argumentliste mit einem Index aufzählen müssen (z. B. um nach einem bestimmten Wort zu suchen), können Sie dies tun, ohne die Liste zu kopieren oder zu verändern.

Angenommen, Sie möchten eine Argumentliste an einem Doppelstrich ("--") aufteilen und die Argumente vor den Strichen an einen Befehl und die Argumente nach den Strichen an einen anderen übergeben:

 toolwrapper() {
   for i in $(seq 1 $#); do
     [[ "${!i}" == "--" ]] && break
   done || return $? # returns error status if we don't "break"

   echo "dashes at $i"
   echo "Before dashes: ${@:1:i-1}"
   echo "After dashes: ${@:i+1:$#}"
 }

Die Ergebnisse sollten wie folgt aussehen:

 $ toolwrapper args for first tool -- and these are for the second
 dashes at 5
 Before dashes: args for first tool
 After dashes: and these are for the second

5voto

g24l Punkte 2897
aparse() {
while [[ $# > 0 ]] ; do
  case "$1" in
    --arg1)
      varg1=${2}
      shift
      ;;
    --arg2)
      varg2=true
      ;;
  esac
  shift
done
}

aparse "$@"

1voto

JimmyLandStudios Punkte 409

getopt Verwenden Sie den Befehl in Ihren Skripten, um alle Befehlszeilenoptionen zu formatieren oder Parameter zu formatieren.

#!/bin/bash
# Extract command line options & values with getopt
#
set -- $(getopt -q ab:cd "$@")
#
echo
while [ -n "$1" ]
do
case "$1" in
-a) echo "Found the -a option" ;;
-b) param="$2"
echo "Found the -b option, with parameter value $param"
shift ;;
-c) echo "Found the -c option" ;;
--) shift
break ;;
*) echo "$1 is not an option";;
esac
shift

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