Shell 脚本传参踩坑

测试环境

  • C code
    #include <stdio.h>
    int main(int argc, char* args[]){
      printf("[");
      for (int i=0; i<argc; i++){
          printf("\"%s\", ", args[i]);
      }
      printf("]\n");
      return 0;
    }

    bash 脚本

    GO_TAGS='jsoniter dev'
    GO_LDFLAGS="-w -s -X main.buildOS='$(go env GOHOSTOS)/$(go env GOHOSTARCH)' -X main.commitId='${commitId}'"
    GO_FLAGS="-ldflags=\"${GO_LDFLAGS}\" -tags='${GO_TAGS}' -trimpath"
    echo ./a.out $GO_FLAGS
    ./a.out "$GO_FLAGS"
    ./a.out $GO_FLAGS
    eval ./a.out $GO_FLAGS

    bash 执行结果

    ./a.out -ldflags="-w -s -X main.buildOS='linux/amd64' -X main.commitId=''" -tags='jsoniter dev' -trimpath
    ["./a.out", "-ldflags="-w -s -X main.buildOS='linux/amd64' -X main.commitId=''" -tags='jsoniter dev' -trimpath", ]
    ["./a.out", "-ldflags="-w", "-s", "-X", "main.buildOS='linux/amd64'", "-X", "main.commitId=''"", "-tags='jsoniter", "dev'", "-trimpath", ]
    ["./a.out", "-ldflags=-w -s -X main.buildOS='linux/amd64' -X main.commitId=''", "-tags=jsoniter dev", "-trimpath", ]
  • 从中可以看出 使用"" 包裹的变量会被当成一个整体传入程序
  • 不使用"" 包裹的变量会以空格进行分割传入
  • eval 会进行重新解析后传入程序

众所周知 应为命令行参数解析的问题 第一二个执行命令 在复杂参数情况下均是错误的。

本作品采用《CC 协议》,转载必须注明作者和本文链接
謎麟
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!