在bash中使用多层引号

abe*_*nky 6 linux bash

我正在尝试编写一个bash脚本,而且我遇到了一个引用问题.

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

lwp-request -U -e -H "Range: bytes=20-30"
Run Code Online (Sandbox Code Playgroud)

我的脚本文件如下:

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}
Run Code Online (Sandbox Code Playgroud)

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

gra*_*ity 13

通常,您可以通过以下方式转义内部引号\:

RANGE="-H \"Range: bytes=20-30\""
Run Code Online (Sandbox Code Playgroud)

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

RANGE="-H \"Range: bytes=20-30\""
eval $CLIENT $REQ_HDRS $RSP_HDRS $RANGE
Run Code Online (Sandbox Code Playgroud)

但是,由于你使用bash而不是sh,你可以在数组中放置单独的参数:

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

这可以扩展到:

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

  • @abelenky:请不要使用`eval`,它充满了粗心的陷阱。数组方法要可靠得多。 (2认同)