Nar*_*asK 4 shell bash shell-script
我的脚本:
#! /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}"
Run Code Online (Sandbox Code Playgroud)
出现以下错误让我很难过:
$ ./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:
....
Run Code Online (Sandbox Code Playgroud)
我的错误在哪里?怎样才能做得更好?
据我所知,我已经将 4 个 args 传递[dev, exec, django, sh]给脚本,然后在脚本中删除了 3 ( shift 3),因此sh应该留在$@var 中。
Kus*_*nda 11
与shift "$#"你$@彻底清空。将$@在功能是独立$@于主脚本。既然您确切知道$@需要在函数中使用和移出脚本的多少元素,为什么不将所有参数传递给函数,然后移出前三个?
#! /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" )
shift 3 # we've now used up three arguments
case $verb in
exec)
# Execute a command in a running container.
if [ -n "$service" ]; then
"${cmd[@]}" "$verb" "$service" "$@"
else
echo '## Err: You must specify service name...' >&2
exit 1
fi
;;
*)
printf 'Unknown verb: %s\n' "$verb" >&2
exit 1
esac
}
compose_fn "$@"
Run Code Online (Sandbox Code Playgroud)
我还使用了小写的变量名,这样就不会意外使用系统变量或特殊的 shell 变量(ENV例如,某些 shell 在某些情况下使用的变量),并且我删除了所有不需要的引号和花括号。
我还将命令放入一个数组中,以便我们可以正确引用 YAML 文件名。
您也可以将三个变量的设置移到函数之外,这取决于脚本的其余部分是什么样的,以及这是否有意义。这三个变量将在脚本中成为全局变量。
#! /bin/bash --
set -x
## docker-compose wrapper
compose_fn() {
local cmd=( docker-compose -f "$env.yml" )
case $verb in
exec)
# Execute a command in a running container.
if [ -n "$service" ]; then
"${cmd[@]}" "$verb" "$service" "$@"
else
echo '## Err: You must specify service name...' >&2
exit 1
fi
;;
*)
printf 'Unknown verb: %s\n' "$verb" >&2
exit 1
esac
}
env="$1"
verb="$2"
service="$3"
shift 3
compose_fn "$@"
Run Code Online (Sandbox Code Playgroud)
你也可以绕过[ -n "$service" ]测试
service=${3:?'## Err: You must specify service name...'}
Run Code Online (Sandbox Code Playgroud)
参数扩展${parameter:?word}将退出 shell,并显示wordif定义的消息parameter未设置或为空。该bash壳将格式化此为
script.sh: line 9: 3: ## Err: You must specify service name...
Run Code Online (Sandbox Code Playgroud)
有关的:
| 归档时间: |
|
| 查看次数: |
1340 次 |
| 最近记录: |