我正在运行go 1.8.3,并且在shell脚本中有以下命令:

go build -gcflags='-N -l'

我无法在脚本中使用引号,双引号,转义引号等解决此问题。但是,如果我的脚本中包含以下内容:
gc_flags="-gcflags='-N -l'"
echo go build "${gc_flags}"
go build "${gc_flags}"

但是,如果我从字面上复制并粘贴回显输出到我的控制台中并运行它,它就可以正常工作。

这是我从脚本中得到的错误:
flag provided but not defined: -N -l

感谢您的帮助。 。 。我不记得以前曾经在构建脚本中遇到过这样的问题。

最佳答案

这里的问题是您在变量的值中嵌入了文字单引号。
使用此值时,Shell稍后将不评估这些嵌入式单引号。

运行此命令时:

go build -gcflags='-N -l'

Shell将这些值作为命令行参数传递给go命令:
  • build
  • -gcflags=-N -l

  • 运行此命令时:
    gc_flags="-gcflags='-N -l'"
    go build "${gc_flags}"
    

    Shell将这些值作为命令行参数传递给go命令:
  • build
  • -gcflags='-N -l'

  • 在第一种情况下,单引号不是第二个参数的一部分,
    因为 shell 程序用单引号'-N -l'替换单引号表达式-N -l

    在第二种情况下,不会发生此类替换,
    因为变量的内容包含单引号,
    没有重新评估,
    因此,单引号仍作为第二个参数的一部分。

    解决此问题的一种方法是,仅将标志存储在gc_flags变量中,而不存储-gcflags=
    gc_flags='-N -l'
    go build -gcflags="$gc_flags"
    

    这样会达到预期的效果,
    因为此处gc_flags的值不包含单引号,
    在评估表达式gc_flags='-N -l'时将它们删除。

    另一种方法是使用Bash数组:
    gc_flags=(-gcflags='-N -l')
    go build "${gc_flags[@]}"
    

    以这种形式,
    该数组具有一个值-gcflags=-N -l
    评估数组分配时,已删除嵌入的单引号。

    关于bash - 无法使用Shell脚本中的标志运行go build,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46986532/

    10-15 12:17