Meu roteiro:
#! /bin/bash --
set -x
## docker-compose wrapper
compose_fn() {
local ENV="${1}"
local VERB="${2}"
local SERVICE="${3}"
local CMD="docker-compose -f ${ENV}.yml"
case "${VERB}" in
(exec)
shift "$#" # remove args passed to this fn
# Execute a command in a running container.
if [ -n "${SERVICE}" ]; then
${CMD} "${VERB}" "${SERVICE}" "$@"
else
echo "## Err: You must specify service name..."
exit 1
fi
;;
esac
}
compose_fn "${1}" "${2}" "${3}"
Está me dando uma dificuldade com o seguinte erro:
$ ./tst.sh dev exec django sh
+ compose_fn dev exec django
+ local ENV=dev
+ local VERB=exec
+ local SERVICE=django
+ local 'CMD=docker-compose -f dev.yml'
+ case "${VERB}" in
+ shift 3
+ '[' -n django ']'
+ docker-compose -f dev.yml exec django
Execute a command in a running container
Usage: exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]
Options:
....
Onde está o meu erro? Como isso pode ser feito melhor?
Até onde eu sei, passei 4 argumentos [dev, exec, django, sh]
para o script e, dentro do script, removi 3 ( shift 3
), portanto, sh
deveria ter sido deixado no $@
var.
Com
shift "$#"
você esvaziar$@
completamente. O$@
na função é separado do$@
no script principal. Já que você sabe exatamente quantos elementos do script$@
você precisa usar e desligar na função, por que você não passa todos os argumentos para a função e depois muda os três primeiros?Também usei nomes de variáveis em letras minúsculas para que nenhuma variável de sistema ou shell especial seja usada por acidente (
ENV
é aquela que alguns shells usam em algumas circunstâncias, por exemplo), e removi todas as aspas e chaves desnecessárias.Também coloquei o comando em uma matriz, para que possamos citar o nome do arquivo YAML corretamente.
Você também pode simplesmente mover a configuração das três variáveis para fora da função, dependendo da aparência do resto do script e se isso faz algum sentido. As três variáveis seriam então globais no script.
Você também pode ignorar o
[ -n "$service" ]
teste comA expansão do parâmetro
${parameter:?word}
sairá do shell com a mensagem definida porword
if não definidoparameter
ou vazio. Obash
shell formataria isso comoRelacionado: