Вы сказали getopts
, что опция -d
должна принимать аргумент, а в командной строке вы используете -d -f myformat
, что явно (? )говорит: «-f
— это аргумент, который я привожу для варианта -d
».
Это ошибка не в коде, а в использовании скрипта в командной строке.
Ваш код должен проверять правильность аргументов опции -и правильность установки всех опций.
Возможно что-то вроде
while getopts "d:f:" opt; do
case $opt in
d) dir=$OPTARG ;;
f) format=$OPTARG ;;
*) echo 'error' >&2
exit 1
esac
done
# If -d is *required*
if [ ! -d "$dir" ]; then
echo 'Option -d missing or designates non-directory' >&2
exit 1
fi
# If -d is *optional*
if [ -n "$dir" ] && [ ! -d "$dir" ]; then
echo 'Option -d designates non-directory' >&2
exit 1
fi
Если параметр -d
является необязательным и если вы хотите использовать значение по умолчанию для переменной dir
в приведенном выше коде, вы должны начать с установки dir
на это значение по умолчанию. перед циклом while
.
Параметр командной строки не может одновременно принимать и не принимать аргумент.