Po kilku dniach od research nadal nie mogę znaleźć najlepszej metody analizowania argumentów cmdline w skrypcie .sh. Według moich odniesień getopts cmd jest droga, ponieważ „ekstraktów i sprawdza przełączników bez zakłócania parametru pozycyjnego przełączniki variables.Unexpected lub przełączników, których brakuje argumentów, są ujmowane i reportedas błędów.”Najlepszy sposób analizowania argumentów linii poleceń w Bashu?
pozycyjne parametry (np. 2 - $ @, $ #, itp.) najwyraźniej nie działają dobrze, gdy są zaangażowane spacje, ale potrafią rozpoznać parametry regularne i długie (-p i --longparam). Zauważyłem, że obie metody zawodzą przy przekazywaniu parametrów z zagnieżdżonymi cudzysłowami ("to jest przykład z" "cytuje" "."). Która z tych trzech próbek kodu najlepiej ilustruje sposób radzenia sobie z argumentami cmdline? Funkcja getopt nie jest polecana przez guru, więc staram się tego uniknąć!
Przykład 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
Przykład 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*
Przykład 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
możliwy duplikat [Jak analizować argumenty linii komend w bash?] (Http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash) –