我知道在stackoverflow之前已经问过并回答了类似的问题(例如here和here)但是到目前为止我还没能弄清楚我的具体情况。
我正在尝试创建一个仅在变量-v
等于something
时添加"true"
标志的脚本(我要做的是挂载当前文件夹作为位于Docker容器中/src
的卷):
docker run --name image-name `if [ "${something}" == "true" ]; then echo "-v $PWD:/src"; fi` ....
问题是$PWD
可能包含空格,如果是,我的脚本将无效。我也尝试将"$PWD"
分配给一个中间变量,但它仍然不起作用:
temp="$PWD"
docker run --name image-name `if [ "${something}" == "true" ]; then echo "-v $temp:/src"; fi` ....
如果我跑:
docker run --name image-name -v "$PWD":/src ....
来自普通的bash(不使用我的脚本)然后一切正常。
有谁知道如何解决这个问题?
答案 0 :(得分:4)
使用数组。
docker_args=()
if something; then
docker_args+=( -v "$PWD/src" )
fi
docker run --blah "${docker_args[@]}" …
没有阵列?使用set
(在函数中,因此它不会影响外部范围)。
一般而言:
knacker() {
if something; then
set -- -v "$PWD:/src" "$@"
fi
crocker "$@"
}
knacker run --blah
但是一些命令(如docker,git等)需要特殊处理,因为它们有两部分命令结构。
slacker() {
local cmd="$1"
shift
if something; then
set -- -v "$PWD:/src" "$@"
fi
docker "$cmd" "$@"
}
slacker run --blah
答案 1 :(得分:0)
试试这个(使用数组方式):
declare -a cmd=()
cmd+=(docker run --name image-name)
if [ "${something}" = "true" ]
then
cmd+=(-v "$PWD:/src")
fi
"${cmd[@]}"