首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >位置参数的转义参数

位置参数的转义参数
EN

Unix & Linux用户
提问于 2019-02-24 16:30:27
回答 1查看 709关注 0票数 4

我有外部bash脚本,系统用bash调用这个脚本来编译golang源代码,并且我能够配置一些变量。这个脚本是一个golang-build.eclass。此脚本中的构建函数是:

代码语言:javascript
复制
golang-build_src_compile() {
    debug-print-function ${FUNCNAME} "$@"

    ego_pn_check
    set -- env GOPATH="${WORKDIR}/${P}:$(get_golibdir_gopath)" \
        GOCACHE="${T}/go-cache" \
        go build -v -work -x ${EGO_BUILD_FLAGS} "${EGO_PN}"
    echo "$@"
    "$@" || die
}

我唯一能从外部配置的是EGO_BUILD_FLAGS变量。

这个脚本的问题是当我试图在EGO_BUILD_FLAGS变量中使用引号时,例如:

代码语言:javascript
复制
EGO_BUILD_FLAGS="-ldflags \"-X main.buildVersion=0\""

构建脚本正在打印(使用echo)正确的命令来执行,但是实际的命令由于invalid value "\"-X" for flag -ldflags错误而失败。如果我只是复制打印输出并手动运行它,它就成功完成了。

以下是用于复制它的简化版本:

代码语言:javascript
复制
EGO_BUILD_FLAGS="-ldflags \"-X main.buildVersion=0\""
set -- go build -x ${EGO_BUILD_FLAGS} github.com/g4s8/gitstrap/cmd/gitstrap
echo "$@"
"$@"

产出:

代码语言:javascript
复制
go build -x -ldflags "-X main.buildVersion=0" github.com/g4s8/gitstrap/cmd/gitstrap
invalid value "\"-X" for flag -ldflags: missing = in =
usage: go build [-o output] [-i] [build flags] [packages]
Run 'go help build' for details.

这里的第一行是工作命令,看起来像预期的。这里的问题似乎是$4"-X$5main.buildVersion=0"

能否从脚本变量转义引号,将正确的构建参数作为位置参数传递给set

这里唯一可能的解决方案是更改EGO_BUILD_FLAGS变量,set -- ...命令是不可访问的,它位于外部脚本文件中。

EN

回答 1

Unix & Linux用户

发布于 2019-02-24 18:30:20

引用很简单,您可以使用单引号而不是双引号:

代码语言:javascript
复制
EGO_BUILD_FLAGS='-ldflags "-X main.buildVersion=0"'

但这并不是问题的根源:

代码语言:javascript
复制
$ go build -x ${EGO_BUILD_FLAGS} github.com/g4s8/gitstrap/cmd/gitstrap
invalid value "\"-X" for flag -ldflags: missing = in =
usage: go build [-o output] [-i] [build flags] [packages]
Run 'go help build' for details.

问题是,您要将变量的内容作为单个值传递。看看如果您在set -x中运行这个程序会发生什么:

代码语言:javascript
复制
$ set -x
$ go build -x ${EGO_BUILD_FLAGS} github.com/g4s8/gitstrap/cmd/gitstrap
+ go build -x -ldflags '"-X' 'main.buildVersion=0"' github.com/g4s8/gitstrap/cmd/gitstrap
invalid value "\"-X" for flag -ldflags: missing = in =
usage: go build [-o output] [-i] [build flags] [packages]
Run 'go help build' for details.

最简单的解决方案是从变量中删除-ldflags,只存储您想要传递给-ldflags的值。然后,您可以根据需要使用您的变量:

代码语言:javascript
复制
EGO_BUILD_FLAGS='-X main.buildVersion=0'
go build -x -ldflags ${EGO_BUILD_FLAGS} github.com/g4s8/gitstrap/cmd/gitstrap

如果这不是一个选项,则可以使用数组来代替:

代码语言:javascript
复制
EGO_BUILD_FLAGS=('-ldflags' '-X' 'main.buildVersion=0')
go build -x "${EGO_BUILD_FLAGS[@]}" github.com/g4s8/gitstrap/cmd/gitstrap

最后,您不能引用在变量中设置的值:

代码语言:javascript
复制
EGO_BUILD_FLAGS='-ldflags -X main.buildVersion=0'
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/502715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档