【问题标题】:Using multiple layers of quotes in bash在 bash 中使用多层引号
【发布时间】:2017-05-09 21:42:44
【问题描述】:

我正在尝试编写 bash 脚本,但遇到了引用问题。

我追求的最终结果是让我的脚本调用:

lwp-request -U -e -H "Range: bytes=20-30"

我的脚本文件如下所示:

CLIENT=lwp-request
REQ_HDRS=-U
RSP_HDRS=-e
RANGE="-H "Range: bytes=20-30""   # Obviously can't do nested quotes here
${CLIENT} ${REQ_HDRS} ${RSP_HDRS} ${RANGE}

我知道我不能使用嵌套引号。但是我怎样才能做到这一点呢?

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    通常,您可以使用 \ 转义内部引号:

    RANGE="-H \"Range: bytes=20-30\""
    

    但这在运行命令时不起作用——除非你把eval放在整个事情之前:

    RANGE="-H \"Range: bytes=20-30\""
    eval $CLIENT $REQ_HDRS $RSP_HDRS $RANGE
    

    但是,由于您使用的是 bash,而不是 sh,因此您可以将单独的参数放入数组中:

    RANGE=(-H "Range: bytes=20-30")
    $CLIENT $REQ_HDRS $RSP_HDRS "${RANGE[@]}"
    

    这可以扩展为:

    ARGS=(
        -U                             # Request headers
        -e                             # Response headers
        -H "Range: bytes=20-30"        # Range
    )
    $CLIENT "${ARGS[@]}"
    

    【讨论】:

    • 反斜杠转义和使用eval 为我修复了它。谢谢!稍后我会考虑转换为参数数组。
    • @abelenky:请不要使用eval,它充满了粗心大意的陷阱。数组方法要可靠得多。
    • 如果这仍然不起作用,你如何调试它?在这个例子中,如果你只是 echo$ARGS 应该是什么样子?
    • @WoodrowShigeru:你首先应该回显$ARGS,因为它只会访问数组的第一个元素(即-U在这种情况下)(更不用说如果 arg 恰好是 -e 或 -n 会混淆 'echo' 命令)——只有 ${ARGS[@]} 会给你所有元素。但是,由于 echo 是 echo,它只会将它们与空格粘合在一起,并且仍然不会告诉您任何关于 which arg 是什么的信息。相反,您应该使用 typeset -p ARGS 来检查 bash 变量,或类似 for x in ${!ARGS[@]}; do echo "arg $x = ${ARGS[x]}"; done 的东西。
    • 嗯,这就是我的意思,对不起:只是为了调试,数组里面是什么? echo "${ARGS[@]}" 你应该看到引号吗?因为我试图将带有空格的视频文件名传递给ffmpeg,但这不起作用(从最近开始)。 — 好的,我看到 typeset 的引号,而 echo 循环看不到。
    【解决方案2】:

    试试这个:

    RANGE='\"-H \"范围:字节=20-30\"\"

    你可以使用 '' 和 \"

    no_error=''errors=\"0\"'';

    【讨论】:

    • 你搜索了什么来找到一个 6 岁的问题!?
    • 谷歌中的“bash 三级引号”。这是最佳答案。
    【解决方案3】:

    您可以使用 '' 和 "" 都可用于字符串这一事实。
    所以你可以这样做:

    x='Say "hi"'
    y="What's up?"
    

    【讨论】:

    • 这将创建一个包含引号的字符串。但是,如果您尝试将其传递给命令,它将不起作用。按照grawity's answer 使用数组对我有用。
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2021-09-08
    • 2014-06-14
    相关资源
    最近更新 更多