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:]]*
не работает при использовании в функции.
'' '' это не то же самое, что '' '', т.е. не является пустой строкой (в ней есть пробел). Если вы хотите разбить ведущие пробелы, вы можете сделать это – Hasturkun
@John Kugelman: Вы абсолютно правы, но, возможно, это не самый распространенный сценарий. Ну, в таком случае вы просто не используете эту вещь. Ура !! – MacUsers
Вы можете поиграть с этим скриптом: 'while getopts 'f: c" arg; do echo "$ arg: $ OPTARG"; сделано; shift $ ((OPTIND-1)); printf "Arg:% s \ n" "$ @" 'с различными последовательностями параметров. Обратите внимание, что если вы наберете './test-getopts.sh -f -c',' -f' получит двунаправленную опцию в качестве аргумента опции. Это простое правило, которое реализует 'getopts' (и основная функция' getopt() '; это не всегда то, что люди хотят. Извинение, что '--' может быть именем файла, довольно тонкое; если вы хотите указать имя файла в текущем каталоге, состоящем из двух тире, вы можете/должны писать './--', конечно. –