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 协议》,转载必须注明作者和本文链接