2013-08-29 6 views
4

I (предположительно каждый), пораженный этой проблемой время от времени, но не смог найти подходящего обходного пути. Когда getopts ищет аргумент, он буквально принимает следующий, даже если это опция. Это то, что я сделал, чтобы остановить это (фрагмент кода):Как остановить getopts от пустых или нулевых или других опций в качестве значения опциона

#!/bin/bash 

function optsGet() 
{ 
    while getopts ":c:f" opt; do 
     case $opt in 
      c) [[ -z "${OPTARG}" || "${OPTARG}" == -* ]] \ 
       && { echo -e "ERROR: Invalid argument\n"; exit 1; } 
       CNAME="${OPTARG}.tEsTsTr" 
       ;; 
      f) FORCE=true 
       ;; 
      \?) echo -e "Invalid option: -$OPTARG\n" >&2;; 
      :) echo -e "Missing argument for -$OPTARG\n" >&2; exit 1;; 
      *) echo -e "Unimplemented option: -$OPTARG\n" >&2; exit 1;; 
     esac 
    done 

    shift $(($OPTIND - 1)) 
} 

optsGet "${@}" 
echo -e "CNAME: ${CNAME}\n" 

, но он по-прежнему принимает пустой/нуль в качестве действительного аргумента. Таким образом, это работает:

[email protected] testtools$ ./getopts.sh -c -f 
ERROR: Invalid argument 

Но это не так:

[email protected] testtools$ ./getopts.sh -c " " -f 
CNAME: .tEsTsTr 

[email protected] testtools$ ./getopts.sh -c \ -f 
CNAME: .tEsTsTr 

я скорее ожидал Missing argument for -c ошибку. Здесь что-то не хватает? Или кто-нибудь знает обходное решение? Любой вход будет очень ценным. Ура !!


Update (в основном на основе devnull «ы ответ):

Просто для полноты картины, теперь у меня есть эта маленькая функция:

function ifEmpty() 
{ 
    local VAL=$1 
    local OPT=$2 

    [[ -z "${VAL}" || "${VAL}" =~ ^[[:space:]]*$ || "${VAL}" == -* ]] \ 
    && { echo -e "\n ERROR: Missing argument for option: -${OPT}\n" >&2; exit 1; } 
} 

, то это может быть использовано как это:

c) ifEmpty "${OPTARG}" "${opt}" 
    CNAME=${OPTARG//[[:space:]]} 
    ;; 

для всех параметры, которым нужен аргумент. Ура !!

PS. по какой-то причине *[[:space:]]* не работает при использовании в функции.

+0

'' '' это не то же самое, что '' '', т.е. не является пустой строкой (в ней есть пробел). Если вы хотите разбить ведущие пробелы, вы можете сделать это – Hasturkun

+0

@John Kugelman: Вы абсолютно правы, но, возможно, это не самый распространенный сценарий. Ну, в таком случае вы просто не используете эту вещь. Ура !! – MacUsers

+0

Вы можете поиграть с этим скриптом: 'while getopts 'f: c" arg; do echo "$ arg: $ OPTARG"; сделано; shift $ ((OPTIND-1)); printf "Arg:% s \ n" "$ @" 'с различными последовательностями параметров. Обратите внимание, что если вы наберете './test-getopts.sh -f -c',' -f' получит двунаправленную опцию в качестве аргумента опции. Это простое правило, которое реализует 'getopts' (и основная функция' getopt() '; это не всегда то, что люди хотят. Извинение, что '--' может быть именем файла, довольно тонкое; если вы хотите указать имя файла в текущем каталоге, состоящем из двух тире, вы можете/должны писать './--', конечно. –

ответ

4

-z вернет true для пустой строки, а не для строки, содержащей пробелов.

Проверьте, не содержит ли строка только пробелы. Скажи:

c) [[ -z "${OPTARG}" || "${OPTARG}" =~ ^[[:space:]]*$ || "${OPTARG}" == -* ]] \ 

вместо

c) [[ -z "${OPTARG}" || "${OPTARG}" == -* ]] \ 

Это также обрабатывать нуль (\) случай.

EDIT: На самом деле, это также можно записать в виде:

c) [[ -z "${OPTARG}" || "${OPTARG}" == *[[:space:]]* || "${OPTARG}" == -* ]] \ 
+0

Спасибо devnull! Думаю, я пойду с '^ [[: space:]] * $'. Один недостаток с '[[: space:]] *' is: он также считает '' test "' как недопустимый аргумент, который может быть или не быть правдой в некоторых случаях. Ура !! – MacUsers

+0

Ах! в последней есть опечатка. Он должен читать '* [[: space:]] *' вместо этого. Отредактировано выше. – devnull

+0

Это изменение исправит проблему '' test '', о которой вы упомянули. – devnull

-1

Это может быть не ответ ответ, но я бы не пытался остановить его. Если -c принимает имя файла в качестве аргумента, скажем, -f может быть допустимым именем файла, равно как и   (пробел). Как правило, я не считаю, что сценарии оболочки должны делать «полезные» вещи, такие как обрезание пробелов или выкидывание необычных, но технически обоснованных аргументов.

 Смежные вопросы

  • Нет связанных вопросов^_^