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
Schreibe einen Kommentar