Shell脚本如何从配置文件动态解析对应域名的密钥变量?
嘿,这个错误很好解决——你用错命令啦!let是专门用来做算术计算的,不是用来获取字符串变量值的,难怪它看到key-to-something这种非数字内容会报错。
接下来给你两种解决方案,适配不同的Shell环境:
如果你要兼容POSIX标准Shell(比如系统默认的sh)
用eval来实现动态变量的引用,这是POSIX环境下通用的做法:
#!/usr/bin/env sh source ./vars.config key="_key" for i in "${domains[@]}"; do # 把域名的点替换成下划线,生成变量名前缀 base="$(echo "$i" | tr . _)" # 拼接出完整的变量名,比如something_com_key varname="${base}${key}" # 通过eval获取这个变量的值 farmid=$(eval echo "\$$varname") echo "$farmid" done
如果你用Bash(推荐,更安全)
如果你的脚本可以用Bash运行(把开头改成#!/usr/bin/env bash),可以用Bash自带的间接变量扩展语法,比eval更安全,不会有命令注入的风险:
#!/usr/bin/env bash source ./vars.config key="_key" for i in "${domains[@]}"; do base="$(echo "$i" | tr . _)" varname="${base}${key}" # 用${!varname}直接获取动态变量的值 farmid="${!varname}" echo "$farmid" done
还要注意几个小细节:
- 你原始脚本里
#!/usr/bin/env sh和source命令写在同一行,这会导致脚本无法正确识别解释器,一定要分成两行写! - 遍历数组的时候记得用
"${domains[@]}"(带双引号),不然如果域名里有空格或者特殊字符,遍历会出问题。 - 变量赋值和引用时尽量加双引号,避免字符串被意外拆分。
内容的提问来源于stack exchange,提问作者TimmyV
相关产品推荐
相关产品推荐

