【问题标题】:How to escape space in bash script from inline if?如何从内联中转义bash脚本中的空格?
【发布时间】:2015-09-18 03:24:58
【问题描述】:

我知道之前在 stackoverflow 上已经提出并回答了类似的问题(例如 herehere),但到目前为止,我还无法针对我的特殊情况弄清楚。

我正在尝试创建一个脚本,仅当变量 something 等于 "true" 时才添加 -v 标志(我想要做的是将当前文件夹挂载为位于/src 在 Docker 容器中):

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(不使用我的脚本)然后一切正常。

有人知道怎么解决吗?

【问题讨论】:

  • 这本质上是Bash FAQ 050。所以答案是你没有。你不这样做。您使用数组或类似的。
  • 欢迎来到文件名空间地狱。一个漂亮的符号链接指向该死的文件名并且不包含空格怎么样?

标签: bash


【解决方案1】:

使用数组。

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

【讨论】:

  • 击败我。以秒为单位 ;-)
【解决方案2】:

试试这个(使用数组方式):

declare -a cmd=()
cmd+=(docker run --name image-name)
if [ "${something}" = "true" ]
then
  cmd+=(-v "$PWD:/src")
fi
"${cmd[@]}"

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2019-12-17
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多