проблема в getopt, сценарий оболочки Unix - PullRequest
1 голос
/ 27 сентября 2010

Привет, может кто-нибудь решить эту проблему, я не могу получить outpt.

Я не могу получить вывод -p

#!/bin/bash 

args=`getopt c:m:p $*` 

if [ $? != 0  -o $# == 0 ] 
then 
  echo 'Usage: -c <current-dir> -m <my dir> -p <argument>' 
  exit 1 
fi 

set -- $args 

for i 
do 
 case "$i" in 
         -c) shift;CURRDIR=$1;shift;shift ;; 
         -m) MYDIR=$1;shift;; 
         -p) ARGVAL=$OPTARG;; 
   esac 
done 

echo "CURRDIR = $CURRDIR" 
echo "MYDIR = $MYDIR" 
echo "ARGVAL = $ARGVAL" 

./1.sh -c "def" -m "ref" -p "ref -k ref" 

Ожидаемый результат

output -c = "def" 
-m ="ref" 
-p ="ref -k ref"

1 Ответ

5 голосов
/ 27 сентября 2010

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 каждый раз, чтобы получить значение каждого параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...