it-swarm.com.de

Wie kann ich unter Linux mit einem Terminal-Befehl ein Datei-Argument an mein Bash-Skript übergeben?

Meine Frage ist also, wie ich unter Linux mit einem Terminal-Befehl ein Datei-Argument an mein Bash-Skript übergeben kann. Im Moment versuche ich, ein Programm in Bash zu erstellen, das ein Dateiargument aus dem Terminal nehmen und es als Variable in meinem Programm verwenden kann. Zum Beispiel starte ich myprogram --file=/path/to/file im Terminal.

Mein Programm

#!/bin/bash    
File=(the path from the argument)  
externalprogram $File (other parameters)

Wie kann ich das mit meinem Programm erreichen?

40
AZorin

Es ist einfacher (und "richtiger", siehe unten), wenn Sie Ihr Skript einfach als ausführen

myprogram /path/to/file

Dann können Sie auf den Pfad innerhalb des Skripts als $1 Zugreifen (für Argument # 1 ist $2 Ebenfalls Argument # 2 usw.).

file="$1"
externalprogram "$file" [other parameters]

Oder nur

externalprogram "$1" [otherparameters]

Wenn Sie den Pfad aus etwas wie --file=/path/to/file Extrahieren möchten, geschieht dies normalerweise mit der Shell-Funktion getopts. Dies ist jedoch komplizierter als das bloße Referenzieren von $1. Außerdem sollten Schalter wie --file= Optional sein. Ich vermute, dass Ihr Skript erfordert einen Dateinamen zur Verfügung stellen muss, daher macht es keinen Sinn, ihn in Option zu übergeben.

55
David Z

sie können getopt verwenden, um Parameter in Ihrem Bash-Skript zu behandeln. Es gibt nicht viele Erklärungen für getopt da draußen. Hier ist ein Beispiel:

#!/bin/sh

OPTIONS=$(getopt -o hf:gb -l help,file:,foo,bar -- "[email protected]")

if [ $? -ne 0 ]; then
  echo "getopt error"
  exit 1
fi

eval set -- $OPTIONS

while true; do
  case "$1" in
    -h|--help) HELP=1 ;;
    -f|--file) FILE="$2" ; shift ;;
    -g|--foo)  FOO=1 ;;
    -b|--bar)  BAR=1 ;;
    --)        shift ; break ;;
    *)         echo "unknown option: $1" ; exit 1 ;;
  esac
  shift
done

if [ $# -ne 0 ]; then
  echo "unknown option(s): [email protected]"
  exit 1
fi

echo "help: $HELP"
echo "file: $FILE"
echo "foo: $FOO"
echo "bar: $BAR"

siehe auch:

20
lesmana

Bash unterstützt ein Konzept namens "Positional Parameters". Diese Positionsparameter stellen Argumente dar, die in der Befehlszeile angegeben werden, wenn ein Bash-Skript aufgerufen wird.

Positionsparameter werden mit den Namen $0, $1, $2 Usw. bezeichnet. $0 Ist der Name des Skripts selbst, $1 Ist das erste Argument für das Skript, $2 Das zweite usw. $* Repräsentiert die gesamte Position Parameter, außer $0 (dh beginnend mit $1).

Ein Beispiel:

#!/bin/bash
FILE="$1"
externalprogram "$FILE" <other-parameters>
12
Dan Moulding

Angenommen, Sie tun, was David Zaslavsky vorschlägt, so dass das erste Argument einfach ist das auszuführende Programm (keine Optionsanalyse erforderlich) ist, dann haben Sie es mit der Frage zu tun, wie Argumente 2 und weiter übergeben werden sollen Ihr externes Programm. Hier ist ein bequemer Weg:

#!/bin/bash
ext_program="$1"
shift
"$ext_program" "[email protected]"

Das shift entfernt das erste Argument und benennt den Rest um ($2 Wird zu $1, and so on). $ @ `Verweist auf die Argumente als Array von Wörtern (es muss in Anführungszeichen gesetzt werden!) .

Wenn Sie Ihre --file - Syntax haben müssen (wenn beispielsweise ein Standardprogramm ausgeführt werden soll, muss der Benutzer nicht unbedingt eines angeben), ersetzen Sie ext_program="$1" Durch die Syntaxanalyse von $1 Müssen Sie tun, vielleicht mit getopt oder getopts.

Wenn Sie nur für den einen bestimmten Fall Ihre eigene Rolle spielen möchten, können Sie Folgendes tun:

if [ "$#" -gt 0 -a "${1:0:6}" == "--file" ]; then
    ext_program="${1:7}"
else
    ext_program="default program"
fi
2
Cascabel