Nach mehreren Tagen von research kann ich immer noch nicht die beste Methode zum Parsen von cmdline args in einem .sh-Skript herausfinden. Nach meinen Referenzen die getopts cmd die Art und Weise, da es zu gehen „Extrakte und prüft, schaltet den Positionsparameter variables.Unexpected Schalter ohne Störung oder Schaltern, die Argumente fehlen, werden erkannt und reportedas Fehler.“Die beste Methode zum Parsen von Befehlszeilenargumenten in Bash?
Positional Parameter (Bsp. 2 - $ @, $ #, usw.) funktionieren anscheinend nicht gut, wenn Leerzeichen involviert sind, können aber reguläre und lange Parameter (-p und --longparam) erkennen. Ich habe festgestellt, dass beide Methoden fehlschlagen, wenn Parameter mit verschachtelten Anführungszeichen übergeben werden ("das ist ein Beispiel von" "Anführungszeichen" "."). Welches dieser drei Codebeispiele zeigt am besten, wie man mit Befehlszeilen umgehen kann? Die getopt Funktion wird nicht von Gurus empfohlen, also versuche ich es zu vermeiden!
Beispiel 1:
#!/bin/bash
for i in "[email protected]"
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 [email protected]’
let i=1
for x in [email protected]; 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 [email protected]
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 parse ich Befehlszeilenargumente in bash?] (Http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash) –