После нескольких дней research я до сих пор не могу найти лучший метод для разбора cmdline args в сценарии .sh. По моим ссылкам на getopts ЦМДЕ является путем, так как он «экстрактов и проверяют переключатели, не нарушая позиционный параметр variables.Unexpected выключатели или переключатели, которые отсутствуют аргументы, распознается и reportedas ошибки.»Лучший способ разбора командной строки args в Bash?
Позиционных params (Пример 2 - $ @, $ # и т. д.), по-видимому, не работают хорошо, когда задействованы пробелы, но могут распознавать регулярные и длинные параметры (-p и --longparam). Я заметил, что оба метода терпят неудачу при передаче параметров с вложенными кавычками («это Ex. Of» «quotes» «.»). Какой из этих трех примеров кода лучше всего иллюстрирует способ работы с аргументами cmdline? Функция getopt не рекомендуется гуру, поэтому я стараюсь ее избегать!
Пример 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
Пример 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*
Пример 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
Возможный дубликат [Как проанализировать аргументы командной строки в bash?] (Http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash) –