我的脚本:
#! /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}"
以下错误让我很难受:
$ ./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:
....
我的错误在哪里?怎样才能做得更好?
据我所知,我已经将 4 个 args 传递[dev, exec, django, sh]
给脚本,然后在脚本中删除了 3 ( shift 3
),因此sh
应该留在$@
var 中。
与
shift "$#"
你彻底清空$@
。函数中的与主脚本中$@
的 是分开的。$@
既然您确切知道需要在函数中使用和移出多少脚本元素$@
,为什么不将所有参数传递给函数,然后移出前三个?我还使用了小写的变量名称,这样就不会意外使用系统或特殊的 shell 变量(
ENV
例如,某些 shell 在某些情况下使用的变量),并且我删除了所有不需要的引号和花括号。我还将命令放入一个数组中,以便我们可以正确引用 YAML 文件名。
您也可以将三个变量的设置移到函数之外,具体取决于脚本的其余部分以及这是否有意义。这三个变量将在脚本中是全局的。
您也可以绕过
[ -n "$service" ]
测试参数扩展
${parameter:?word}
将退出 shell,并带有word
ifparameter
未设置或为空定义的消息。bash
外壳会将其格式化为有关的: