Я (предположительно, все) время от времени сталкивался с этой проблемой, но не мог найти подходящего решения самостоятельно. Когда 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"
но он по-прежнему принимает пустой/нуль в качестве допустимого аргумента. Итак, это работает:
san@AM0150 testtools$ ./getopts.sh -c -f
ERROR: Invalid argument
Но это не:
san@AM0150 testtools$ ./getopts.sh -c " " -f
CNAME: .tEsTsTr
san@AM0150 testtools$ ./getopts.sh -c \ -f
CNAME: .tEsTsTr
Я скорее ожидал Missing argument for -c
ошибки. Есть ли что-то, что мне здесь не хватает? Или кто-нибудь знает обходной путь? Любой вклад будет высоко оценен. Ваше здоровье!!
Обновление (в основном на основе ответа 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:]]*
не работает при использовании в функции.
^[[:space:]]*$
. Недостатком[[:space:]]*
является то, что он также считает" test"
недопустимым аргументом, который в некоторых случаях может быть истинным, а может и нет. Ваше здоровье!! 29.08.2013*[[:space:]]*
. Отредактировано выше. 29.08.2013" test"
, о которой вы упомянули. 29.08.2013=~
вместо==
. ваше здоровье!! 29.08.2013