BASH: как передать аргумент по умолчанию, если никакие аргументы после первого не прошли

У меня есть скрипт bash с выражением case в нем:

 case "$1" in bash) docker exec -it $(docker-compose ps -q web) /bin/bash ;; shell) docker exec -it $(docker-compose ps -q web) python manage.py shell ;; test) docker exec -it $(docker-compose ps -q web) python manage.py test "${@:2}" ;; esac 

В команде test я хочу передать аргумент по умолчанию для apps , но только если пользователь не передал никаких аргументов, кроме test на сценарий bash.

Итак, если пользователь запускает скрипт следующим образом:

 ./do test 

он должен выполнить команду

 docker exec -it $(docker-compose ps -q web) python manage.py test apps 

Однако, если они запускают скрипт следующим образом:

 ./do test billing accounts 

он должен выполнить команду

 docker exec -it $(docker-compose ps -q web) python manage.py test billing accounts 

Как я могу проверить наличие аргументов после первого аргумента?

5 Solutions collect form web for “BASH: как передать аргумент по умолчанию, если никакие аргументы после первого не прошли”

Я бы попытался использовать подстановку переменных bash:

  test) shift docker exec -it $(docker-compose ps -q web) python manage.py test "${@-apps}" ;; 

Другой способ – проверить $* вместо $1 :

 case $* in bash) ... test) docker exec -it $(docker-compose ps -q web) python manage.py test apps ;; test\ *) docker exec -it $(docker-compose ps -q web) python manage.py test "${@:2}" ;; 
 case $1:$# in (test:1) docker $(this is bad) python test apps;; (test:$#) docker $(still bad) python "$@";; (bash:$#) docker ... esac 

что-то вроде этого будет хорошо работать

 if [ -z "$2" ] then echo "No argument supplied" fi 

Вы можете просто сбросить свои аргументы, но вы хотите использовать set ...

 case "$1" in #... test) [ $# -lt 2 ] && set test apps docker exec -it $(docker-compose ps -q web) python manage.py $@ ;; esac 

Если аргументы не имеют пробелов или строк новой строки.
Преобразуйте аргументы в строку: "$*" и используйте это:

 f(){ docker exec -it $(docker-compose ps -q web) "$@"; } case "$*" in bash) f /bin/bash ;; shell) f python manage.py shell ;; test) f python manage.py test apps ;; test\ ?*) f python manage.py "$@" ;; esac 

Использование функции управления кодом (а не переменной) и удаление повторения.

  • Необходимо получить выход Awk в определенной последовательности
  • Простой скрипт установки говорит, что он не может найти пакет
  • Как удалить конечный CRLF из файла?
  • Как войти в удаленную учетную запись пользователя с помощью пароля и выполнить набор команд?
  • как совместить слова и игнорировать пробелы
  • Есть ли заклинание командной строки для сохранения определенных столбцов по имени в CSV-файле?
  • Как я могу найти учетную запись пользователя в различных конфигурационных файлах, связанных с sudo?
  • Копирование больших файлов - создает ли пустым файл в пункте назначения?
  • Как передать содержимое файла параметру / параметру функции
  • Команда для уничтожения определенного PID, предоставленного предыдущей командой
  • Как узнать общие элементы между двумя файлами?
  • Interesting Posts

    Как получить доступ к сети без NetworkManager?

    Как я могу найти пакет Ubuntu для использования с Amazon EC2?

    Как отключить мой монитор от выключения и каждые несколько секунд, когда он должен быть в режиме DPMS?

    Изменение прав доступа к файлам с его символической ссылкой

    $ PATH не изменен внутри LXDE на Raspbian

    Получите вывод `posix_spawn`

    тема oh-my-zsh, похоже, не обновляется, если я не запустил zsh

    no stderr output при использовании stdbuf -o 0 | & tee log

    Как интерпретировать информацию в скобках в Xorg.0.log?

    Существуют ли какие-либо стандарты / документы, которые рассказывают мне, как создавать такие полезные справочные сообщения?

    Интерактивный инструмент резервного копирования

    Попытка найти все файлы в определенном каталоге, которые не указаны в других файлах

    Как превратить буквы с прописными буквами в верхний регистр? – Используя команду 'tr'

    Сообщения Mutt Outlook искажены

    Есть ли способ заблокировать название терминала?

    Linux и Unix - лучшая ОС в мире.