arrays - SC2207 来自子外壳的 Bash 数组分配未按预期拆分

标签 arrays bash subshell ifs shellcheck

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

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

这引发了 shellcheck error SC2207

Prefer mapfile or read -a to split command output

但是推荐没有按预期工作。

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...

关于arrays - SC2207 来自子外壳的 Bash 数组分配未按预期拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59588882/

相关文章:

java - 如何创建新的 AnyType 数组

linux - rm 最后有 & 符号和没有

bash - 从另一个函数调用时,函数中的子 shell 无法找到基本的 bash 命令

java - 使用二维数组创建和打印乘法表?

c - 在 C 语言中,为什么数组的地址等于它的值?

arrays - 如何找到相同数量和颜色的组在 MATLAB 中给出不同的颜色?

arrays - bash + what unset 命令的反操作 + 添加 arr 成员

bash - 迭代可变路径中的文件 (Bash)

bash - 为什么 tee 等待所有子 shell 完成?

bash - 为什么 $$ 返回与父进程相同的 id?