BASH: como passar um argumento padrão se nenhum argumento após o primeiro ser passado

6

Eu tenho um script bash com uma declaração 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

No comando test , desejo passar o argumento padrão de apps , mas apenas se o usuário não passar nenhum argumento diferente de test para o script bash.

Então, se o usuário executar o script assim:

./do test

deve executar o comando

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

No entanto, se eles executarem o script da seguinte forma:

./do test billing accounts

deve executar o comando

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

Como posso testar a existência de argumentos após o primeiro argumento?

    
por synic 01.02.2016 / 22:41

5 respostas

7

Eu tentaria usar a substituição de variáveis bash:

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

Outra maneira é verificar $* em vez de $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}"
         ;;
    
por 01.02.2016 / 23:25
2
case $1:$# in
(test:1)
    docker $(this is bad) python test apps;;
(test:$#)
    docker $(still bad) python "$@";;
(bash:$#)
    docker ...
esac
    
por 01.02.2016 / 23:37
2

algo assim funcionaria bem

if [ -z "$2" ]
  then
    echo "No argument supplied"
fi
    
por 01.02.2016 / 22:48
2

Você pode apenas redefinir seus argumentos, no entanto, usando set ...

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

Se os argumentos não tiverem espaços ou novas linhas.
Transforme os argumentos em uma string: "$*" e use isso:

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

Usando uma função para gerenciar o código (não uma variável) e remover a repetição.

    
por 02.02.2016 / 04:15