SC2207 来自 subshel​​l 的 Bash 数组分配未按预期拆分

Posted

技术标签:

【中文标题】SC2207 来自 subshel​​l 的 Bash 数组分配未按预期拆分【英文标题】:SC2207 Bash array assignment from subshell not splitting as expected 【发布时间】:2020-04-22 15:01:46 【问题描述】:

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

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

这引发了shellcheck error 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')"

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

【问题讨论】:

在您的问题中添加几行aws ... | cat -A 谢谢。我会记住那个提示的!输出显然是制表符分隔的。我之前通过简单地重定向到一个文件进行了检查。我忽略了我的编辑正在将它们翻译成空格。 【参考方案1】:

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

【讨论】:

以上是关于SC2207 来自 subshel​​l 的 Bash 数组分配未按预期拆分的主要内容,如果未能解决你的问题,请参考以下文章

執行shell script與subshell

Linux - bash while subshell中变量操作的问题

Sparkfun SC16IS750 不适用于 Raspberry Pi

来自一组源节点的 BGL dfs

来自 wchar_t* 的 C++ Win32 GDI+ 拉绳

如何处理 System.Runtime.InteropServices.COMException (0x800706BA):RPC 服务器不可用。 (来自 HRESULT 的异常:0x800706BA