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 

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

  • Использование одной команды для определения скорости NIC
  • Выравнивание при печати серии записей
  • Shell Script для удаления двойных кавычек в пределах значения столбца
  • Переменная в Bash, содержащая кавычки и пробелы
  • Symlink для файла, который еще не существует
  • Вывод сценария оболочки неправильно разбивается при передаче в качестве аргумента скрипту
  • Использовать регистр для / usr / bin / lessecho
  • Добавление вывода команды в цикл for
  • Ошибка при присвоении текущей директории переменной
  • grep с количеством отдельных паттернов
  • Замена переменной, содержащей \ with sed
  • Linux и Unix - лучшая ОС в мире.