о синтаксической ошибке getopt - PullRequest
0 голосов
/ 10 мая 2018

Хорошо, я любитель Linux, играющий с getops и getop; Я прочитал несколько разговоров на нескольких форумах по этой теме, но я не могу заставить свой код работать.

Вот небольшой скрипт, использующий getopts, переработанный с этого форума:

#!bin/bash

while getopts ":a:p:" opt; do
  case $opt in
    a) arg_1="$OPTARG"
    ;;
    p) arg_2="$OPTARG"
    ;;
    \?)
    ;;
  esac
done

printf "Argument firstArg is %s\n" "$arg_1"
printf "Argument secondArg is %s\n" "$arg_2"

делает свою работу:

bash test02.sh -asomestring -bsomestring2 #either with or without quotes
#Argument firstArg is somestring
#Argument secondArg is somestring2

Теперь, поскольку я хочу попробовать длинные имена опций, я пытаюсь getopt, пытаясь понять синтаксис из примеров, которые я нашел в Интернете:

#!/bin/bash

temp=`getopt -o a:b: -l arga:,argb:--"$@"`
eval set --"$temp"

while true ; do
  case "$1" in
    a|arga) firstArg="$OPTARG"
    ;;
    b|argb) secondArg="$OPTARG"
    ;;
    \?)
    ;;
  esac
done

printf "Argument firstArg is %s\n" "$firstArg"
printf "Argument secondArg is %s\n" "$secondArg"

Приведенный выше код не работает:

bash test04.sh -a'somestring' -b'somestring2' #either with or without quotes
#getopt: invalid option -- 'b'
#Try `getopt --help' for more information.
#
bash test04.sh --arga=somestring --argb=somestring2
#getopt: unrecognized option '--argb=somestring2'
#Try `getopt --help' for more information.

Не могли бы вы помочь мне понять мои ошибки?

1 Ответ

0 голосов
/ 10 мая 2018

Вам нужны правильные пробелы до и после --.

temp=`getopt -o a:b: -l arga:,argb: -- "$@"`
eval set -- "$temp" 

И в вашем цикле while, который обрабатывает результат, вам нужно использовать команду shift, чтобы перейти к следующей опции, иначе вы просто будете продолжать обрабатывать одну и ту же опцию навсегда.

getopt не устанавливает переменные, такие как $OPTARG, вы просто используете позиционные параметры.

while true ; do
  case "$1" in
    -a|--arga) firstArg="$2"; shift 2
    ;;
    -b|--argb) secondArg="$2"; shift 2
    ;;
    --) shift; break
    ;;
    *) echo "Bad option: $1"; shift
    ;;
  esac
done

См. Примеры на https://www.tutorialspoint.com/unix_commands/getopt.htm

...