如何从内联中删除bash脚本中的空格if?

时间:2015-09-17 19:13:30

标签: bash

我知道在stackoverflow之前已经问过并回答了类似的问题(例如herehere)但是到目前为止我还没能弄清楚我的具体情况。

我正在尝试创建一个仅在变量-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(不使用我的脚本)然后一切正常。

有谁知道如何解决这个问题?

2 个答案:

答案 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[@]}"