Beste Weg, um parse command line args in der Bash?
Nach mehreren Tagen Forschung, ich kann immer noch nicht herausfinden, was die beste Methode für parsing cmdline args in einem .sh-Skript. Nach meinen Referenzen, die getopts cmd ist der Weg zu gehen, da es "extrahiert und überprüft, Schalter, ohne die positionellen parameter-Variablen.Unerwartete Schalter, oder Schalter, die fehlenden Argumente, werden erkannt und reportedas Fehler."
Positions-params(Ex. 2 - $@, $#, etc) offenbar nicht gut funktionieren, wenn Leerzeichen involviert sind, aber erkennen können, regelmäßige und lange Parameter(-p und --longparam). Ich bemerkte, dass beide Methoden Versagen, wenn die übergabe von Parametern mit verschachtelten Anführungszeichen ("dies ist ein Ex. der ""Anführungszeichen""."). Welche dieser drei code-Beispiele verdeutlicht den Umgang mit cmdline args? Die getopt Funktion wird nicht empfohlen, von gurus, so versuche ich es zu vermeiden!
Beispiel 1:
#!/bin/bash
for i in "$@"
do
case $i in
-p=*|--prefix=*)
PREFIX=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
;;
-s=*|--searchpath=*)
SEARCHPATH=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
;;
-l=*|--lib=*)
DIR=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
;;
--default)
DEFAULT=YES
;;
*)
# unknown option
;;
esac
done
exit 0
Beispiel 2:
#!/bin/bash
echo ‘number of arguments’
echo "\$#: $#"
echo ”
echo ‘using $num’
echo "\$0: $0"
if [ $# -ge 1 ];then echo "\$1: $1"; fi
if [ $# -ge 2 ];then echo "\$2: $2"; fi
if [ $# -ge 3 ];then echo "\$3: $3"; fi
if [ $# -ge 4 ];then echo "\$4: $4"; fi
if [ $# -ge 5 ];then echo "\$5: $5"; fi
echo ”
echo ‘using $@’
let i=1
for x in $@; do
echo "$i: $x"
let i=$i+1
done
echo ”
echo ‘using $*’
let i=1
for x in $*; do
echo "$i: $x"
let i=$i+1
done
echo ”
let i=1
echo ‘using shift’
while [ $# -gt 0 ]
do
echo "$i: $1"
let i=$i+1
shift
done
[/bash]
output:
bash> commandLineArguments.bash
number of arguments
$#: 0
using $num
$0: ./commandLineArguments.bash
using $@
using $*
using shift
#bash> commandLineArguments.bash "abc def" g h i j*
Beispiel 3:
#!/bin/bash
while getopts ":a:" opt; do
case $opt in
a)
echo "-a was triggered, Parameter: $OPTARG" >&2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
exit 0
- mögliche Duplikate von Wie kann ich das Parsen von Kommandozeilen-Argumenten in der bash?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Finde ich die Verwendung von
getopt
Sie die einfachste ist. Es bietet den richtigen Umgang mit Argumenten, die ist schwierig sonst. Zum Beispielgetopt
wird wissen, wie man Argumente zu einer langen option auf der Kommandozeile angegeben als--arg=option
oder--arg option
.Was ist nützlich bei der Analyse übergebene Eingabe in ein shell-Skript ist die Verwendung der
"$@"
Variablen. Finden Sie in der bash man-page, wie dies unterscheidet sich von$@
. Es sorgt dafür, dass Sie verarbeiten kann die Argumente, die Leerzeichen enthalten.Hier ist ein Beispiel, wie ich schreiben könnte s Skript analysieren einige einfache Kommandozeilen-Parameter:
Und verwendet, um zu zeigen, dass Leerzeichen und Anführungszeichen beibehalten:
Einige grundlegende Informationen über die Verwendung von
getopt
finden hierWenn Sie vermeiden wollen, mit
getopt
Sie können mit diesem schönen schnellen Ansatz:- Definition von Hilfe mit allen Optionen als ## Kommentare (anpassen, wie Sie möchten);
- Definieren Sie für jede option eine Funktion mit demselben Namen;
- Kopieren Sie die letzten fünf Zeilen dieses Skripts aus dem Skript (der Magie).
Beispiel: log.sh
Testen:
./log.sh --log yep --log-quiet -l nop -i -l yes
produzieren:Übrigens: Es ist kompatibel mit POSIX!