Лучший способ разобрать аргументы командной строки в Bash?

После нескольких днейисследованиеЯ все еще могуt выяснить лучший способ разбора аргументов cmdline в сценарии .sh. По моим ссылкам, getopts cmd - это то, что нужно.извлекает и проверяет переключатели, не нарушая переменные позиционного параметра. Неожиданные переключатели или переключатели, в которых отсутствуют аргументы, распознаются и сообщаются об ошибках ».

Позиционные параметры (напр. 2 - $ @, $ # и т. Д.) Явно нене работает хорошо, когда используются пробелы, но может распознавать регулярные и длинные параметры (-p и --longparam). Я заметил, что оба метода не работают при передаче параметров с вложенными кавычками ("это Ex. из ""цитаты""."). Какой из этих трех примеров кода лучше всего иллюстрирует способ работы с аргументами cmdline?Getopt функция не рекомендуется гуру, поэтому яЯ пытаюсь избежать этого!

Пример 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

Пример 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*

Пример 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

Ответы на вопрос(2)

Ваш ответ на вопрос