Getopt
args=`getopt c:m:p $*`
Вам необходимо добавить двоеточие после p
, чтобы указать, что -p
принимает аргумент. Также вы должны изменить $*
на "$@"
для лучшей обработки пробелов.
args=`getopt c:m:p: "$@"`
Вы также смешиваете getopt и getopts. $OPTARG
является функцией getopts. С обычным getopt и set вы должны просто использовать $2
и затем убрать аргумент.
-p) ARGVAL=$2; shift 2;;
На данный момент вы сделали все, что могли, используя getopt. К сожалению, он не обрабатывает аргумент из нескольких слов для -p
независимо от того, что вы делаете. Для этого нам нужно использовать getopts.
getopts
С getopt и getopts :
Легче в использовании и, как правило, лучше, чем getopt, хотя, конечно, не доступно в csh-подобных оболочках. Вы не должны использовать их в любом случае.
Это работает несколько иначе, чем "getopt". Во-первых, поскольку это встроенная программа, вы обычно не найдете для нее отдельную справочную страницу, хотя «справочные сведения» могут дать вам то, что вам нужно.
Старый «getopt» вызывается один раз, и он изменяет среду, как мы видели выше. Встроенный getopts вызывается каждый раз, когда вы хотите обработать аргумент, и он не меняет исходные аргументы.
Использование getopts намного проще. Весь ваш цикл может быть упрощен до этого:
while getopts c:m:p: flag
do
case "$flag" in
c) CURRDIR=$OPTARG;;
m) MYDIR=$OPTARG;;
p) ARGVAL=$OPTARG;;
esac
done
Сдвиг не требуется, вы просто читаете $OPTARG
каждый раз, чтобы получить значение каждого параметра.