arrays - SC2207 来自 subshell 的 Bash 数组分配未按预期拆分
问题描述
我一直在使用以下方法填充数组:
AWS_STS_CREDS=( $(aws sts ...) )
首选 mapfile 或 read -a 来拆分命令输出
但是该建议没有按预期工作。
IFS=" " read -r -a AWS_STS_CREDS <<< "$(
aws sts assume-role \
--role-arn ${AWS_ROLE_ARN} --role-session-name ${AWS_SESSION_NAME} \
--query '[Credentials.AccessKeyId,Credentials.SecretAccessKey,Credentials.SessionToken]' \
--output text
)"
echo "Array contains ${#AWS_STS_CREDS[@]} elements"
#> Array contains 1 elements
echo "${AWS_STS_CREDS[0]}"
#> ASIAV2R3U... 4gXdep/GN... FwoGZXI...
我还尝试删除子命令周围的引号。
起初看起来好像设置的IFS没有任何效果,但以下工作:
IFS=" " read -r -a AWS_STS_CREDS <<< "$(echo '1 2 3')"
我忽略了一些东西,但我无法识别问题并想了解行为。
解决方案
根据@Cyrus 的建议,通过管道将子命令输出cat -A
清楚地显示它是制表符分隔的。表示为^I
echo "${AWS_STS_CREDS[0]}"
#> ASIAV2R3U...^I4gXdep/GN...^IFwoGZXI...
如下修改脚本按预期工作:
IFS=$'\t' read -r -a AWS_STS_CREDS <<< "$(
aws sts assume-role \
--role-arn ${AWS_ROLE_ARN} --role-session-name ${AWS_SESSION_NAME} \
--query '[Credentials.AccessKeyId,Credentials.SecretAccessKey,Credentials.SessionToken]' \
--output text
)"
echo "Array contains ${#AWS_STS_CREDS[@]} elements"
#> Array contains 3 elements
echo "${AWS_STS_CREDS[0]}"
#> ASIAV2R3U...
推荐阅读
- java - Spring Hibernate 模式更新不适用于数据库名称中的减号
- azure - 如何在逻辑应用连接无效时收到警报
- c - Raspberry Pi3 上的裸机音频输出在 AARCH64 asm 中工作,但不是 C 版本
- angular - 等待 2 种方法完成 Angular 6
- ms-access - 从差异表单加载事件代码访问复选框值(真/假)
- java - 这是在 pom.xml 中定义 Junit 版本的正确方法吗?
- c# - 使用属性抑制 Coverity 中的消息?
- .net - Apache Ignite .Net 在会话中存储 ComplexType
- javascript - () 符号在这个嵌套的 Record 中是什么意思?反应
- javascript - 使用javascript模糊画布?