AWS Beanstalk build.spec中tr转小写后变量值未更新问题
问题:AWS Beanstalk build.spec中bash变量转小写未生效
先看你的脚本片段:
stg="$STG.js" stg= $stg | tr '[:upper:]' '[:lower:]' cat deployment-config/$stg >> src/tj-paths/pathExtensions.js
当$STG传入Stg3时,你期望stg变成stg3.js,但实际还是Stg3.js——核心问题出在变量赋值的语法错误上。
为什么原来的写法不生效?
在bash里,stg= $stg | tr ...这种写法完全不是你想的“把$stg的值转小写后赋值给stg”。bash会把它解析成:
- 临时设置环境变量
stg=(空值),仅对后面的$stg命令生效 - 尝试执行
$stg这个“命令”——也就是把Stg3.js当作命令名来运行,这大概率会报错Stg3.js: command not found - 把这个错误命令的输出(几乎是空的)传给
tr命令,但整个过程完全没有修改你原来的stg变量,所以它的值还是最初的Stg3.js
两种正确的解决方法
方法1:用命令替换捕获tr的输出
把管道命令的结果通过$(...)捕获后再赋值给变量:
stg="$STG.js" # 用echo输出变量值,通过tr转小写后重新赋值 stg=$(echo "$stg" | tr '[:upper:]' '[:lower:]') cat deployment-config/$stg >> src/tj-paths/pathExtensions.js
方法2:用bash参数扩展(更高效)
如果你的环境用的是bash 4.0及以上版本(AWS Beanstalk的默认环境基本都满足),可以直接用bash内置的参数扩展语法,不需要调用外部的tr命令:
# 直接把$STG转成小写,再拼接.js stg="${STG,,}.js" cat deployment-config/$stg >> src/tj-paths/pathExtensions.js
这里${STG,,}是bash的内置语法,会把变量STG里的所有字符转为小写,比调用外部命令更高效,也更简洁。
用这两种方法,当$STG是Stg3时,stg都会被正确设置为stg3.js,后续的cat命令也能找到对应的配置文件。
内容的提问来源于stack exchange,提问作者Hamed Minaee
相关产品推荐
相关产品推荐

