bash zip 文件,其版本从文件中读取并在 zip 文件名中使用

bash zip file with version read from file and used in zip file name

我可以用 zip

压缩一堆文件
$ zip build.zip src/*.js src/assets/icons/*.png *.json
updating: src/addReactionsNav.js (deflated 65%)
updating: manifest.json (deflated 55%)
updating: src/assets/icons/icon_128.png (stored 0%)
updating: src/assets/icons/icon_16.png (stored 0%)
updating: src/assets/icons/icon_256.png (deflated 0%)
updating: src/assets/icons/icon_48.png (stored 0%)

但我想将其自动化,以便 zip 的名称包含版本。想到这样做:

$ echo "build_$(cat manifest.json | jq .version).zip" | sed s/\"//g
build_1.1.0.zip

但不知道如何将两者“管道化”在一起。

解决方案

感谢@cyrus

zip "build_$(jq -r .version manifest.json).zip" src/*.js src/assets/icons/*.png *.json

build.zip 替换为 "build_$(cat manifest.json | jq -r .version).zip"

更新:

build.zip 替换为 "build_$(jq -r .version manifest.json).zip"

zip "build_$( jq -r .version manifest.json ).zip" ...

要将一个程序的输出包含在另一个程序的命令行中,可以使用 $(...).

zip "$( echo "build_$( cat manifest.json | jq .version ).zip" | sed s/\"//g )" ...

这是您问题的答案,但您可以彻底清理它。

对于初学者,我们可以将反引号移动到内部 $()

zip "$( echo "build_$( cat manifest.json | jq .version | sed s/\"//g ).zip" )" ...

echo "$( ... )" 实际上只是 ....

zip "build_$( cat manifest.json | jq .version | sed s/\"//g ).zip" ...

让我们摆脱无用的 cat

zip "build_$( jq .version manifest.json | sed s/\"//g ).zip" ...

最后,我们可以使用 --raw-output 又名 -r.[=24=,而不是尝试将 JSON 文字转换成它使用 sed 生成的字符串]

zip "build_$( jq -r .version manifest.json ).zip" ...