Intereting Posts
Набор переменных среды, но не соблюдается Программное обеспечение для мониторинга сервера Linux Что требуется: Python (пакет) для файлов спецификаций RHEL? Как устранить проблему пересылки DDNS? Как экспортировать прочитанное письмо от mutt Gnome-tweak-tool – не может читать параметры ввода из-за эллипсированного текста Как я могу вводить пароль только один раз, когда gpg расшифровывает файлы в пакетном режиме Как удалить. с начала строки Bash и записать результат в переменную? Мышь и клавиатура не работают в FreeBSD 9.0 Как проверить, установлена ​​ли моя графическая карта на Linux? Почему modinfo говорит «не удалось найти модуль», но lsmod утверждает, что модуль загружен? Установка USB-накопителя вместо жесткого диска ограничение системной памяти не работает / пример gnome-keyring-daemon не смог выделить защищенную память Могу ли я изменить владельца туннеля после его создания?

Выполнить опцию по умолчанию, если в getopts не указаны параметры

Я последовал за учебником здесь, чтобы узнать, как использовать getopts . Я могу выполнить все опции, предоставленные пользователем. Но теперь я хочу выполнить параметр по умолчанию, если ни один из параметров не предоставлен.

Например:

 while getopts ":hr" opt; do case $opt in h ) show_help; exit 1 ;; r ) echo "Default option executed" ;; esac done 

Таким образом, если пользователь предоставляет либо -h или -r , соответствующие команды должны выполняться (что на самом деле делает), но когда ни один из этих параметров не предоставляется -r должен выполняться по умолчанию. Есть ли способ достичь этого?

ОБНОВИТЬ

Я попробовал предложение cas's и включил *) в мою функцию getopts но ничего похожего не происходит.

 while getopts ":hr" opt; do case $opt in h ) show_help; exit 1 ;; r ) echo "Default option executed" ;; \? ) echo error "Invalid option: -$OPTARG" >&2 exit 1 ;; : ) echo error "Option -$OPTARG requires an argument." exit 1 ;; * ) echo "Default option executed" ;; esac done 

Что-то не так с этим фрагментом?

Выходы Bash выйдут из цикла while, когда не будут предоставлены никакие параметры, установив $ opt в '?'. Чтобы определить эту ситуацию в скрипте, добавьте предложение if после цикла while, похожее на:

 if [ "$opt" = "?" ] then echo "Default option executed (by default)" fi 

Для справки, см. Bourne Shell Builtins

Из того, что я вижу, r не ожидает аргумента. Логически, независимо от того, что происходит, r выполняется таким же образом.

Я бы взял команду, связанную с r из предложения getopts, и выполнить ее независимо. Думаю, этого хватит для ваших требований. Другими словами, поставьте инструкцию echo после инструкции «done».

Вы можете оставить r в getopts в качестве заглушки, если хотите совместимости или по другим причинам.

Вы также можете добавить переменную, установленную в ноль в качестве переключателя. Как только будет выбран любой параметр, отличный от r, у вас есть строка, которая изменяет эту переменную на 1. После инструкции done вы можете написать «если переменная равна нулю, выполнить команду по умолчанию».


Кажется, мне нравится, что «ответит лучше». Я хотел прокомментировать, но у меня нет привилегированных. Я опишу его идею. Это то же самое, что и предложенный Каспием, но у вас есть только одна команда (поэтому у вас нет двойной команды и ошибки в будущем), и это даст вам возможность использовать ее в дополнение к – час

 DEF="Default command executed" while getopts ":hr" opt; do case $opt in h) show_help; exit 1 ;; r) echo "$DEF" ;; *) echo "$DEF" ;; esac done