首页 > 解决方案 > SC2207 来自 subshel​​l 的 Bash 数组分配未按预期拆分

问题描述

我一直在使用以下方法填充数组:

AWS_STS_CREDS=( $(aws sts ...) )

这会引发shellcheck 错误 SC2207

首选 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')"

我忽略了一些东西,但我无法识别问题并想了解行为。

标签: arraysbashsubshellifsshellcheck

解决方案


根据@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...

推荐阅读