我的应用程序中有一个bash脚本,它根据运行脚本的docker环境配置一些API路径。如果文件名是静态的,则以下代码可以正常工作,但是当Angular CLI构建应用程序的生产版本时,它会向文件名添加哈希值。我如何告诉bash脚本使用适合模式的任何文件名?例如,我如何找到文件名main.28ce25b7ef460b2617ae.bundle.js
,其中哈希可以是什么?
我的脚本适用于不添加哈希值的非prod构建
#!/bin/bash
sed -i 's|placeholder_base_service_endpoint|'$BASE_SERVICE_ENDPOINT'|g' main.bundle.js
我尝试使用通配符,但由于字符串未被替换,因此它似乎无法找到该文件。
main.*.bundle.js
答案 0 :(得分:0)
如果要在赋值期间展开glob,一种方法是扩展为数组:
files=( main.*.bundle.js )
作为一些额外的偏执狂,您可能会考虑对结果数组进行完整性检查:
die() { echo "$*" >&2; exit 1; } # define a "die" function to exit if a test fails
[[ -L ${files[0]} || -e ${files[0]} ]] || die "Glob main.*.bundle.js had no matches"
(( ${#files[@]} == 1 )) || die "More than one match for main.*.bundle.js found"
如果不是断言只有一个匹配项要在sed
(或其他)命令行上放置所有匹配,那么可以使用{{{ 1}}。
"${files[@]}"
请注意,在某些平台(尤其是MacOS)上,sed -i
需要一个参数,提供用于备份的文件扩展名。要在这些平台上可靠地工作,传递空字符串是合适的:
sed -i
请注意,在单引号字符串结束后,在展开sed -i '' \
-e 's|placeholder_base_service_endpoint|'"$BASE_SERVICE_ENDPOINT"'|g' \
"${files[@]}"
之前会启动双引号字符串;这样我们可以避免问题,如果该字符串可以被视为一个glob或拆分成多个shell单词。
当然,BASE_SERVICE_ENDPOINT
也可以是文字全球"${files[@]}"
。