SC2207 来自 subshell 的 Bash 数组分配未按预期拆分
Posted
技术标签:
【中文标题】SC2207 来自 subshell 的 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 来自 subshell 的 Bash 数组分配未按预期拆分的主要内容,如果未能解决你的问题,请参考以下文章
Linux - bash while subshell中变量操作的问题
Sparkfun SC16IS750 不适用于 Raspberry Pi
来自 wchar_t* 的 C++ Win32 GDI+ 拉绳
如何处理 System.Runtime.InteropServices.COMException (0x800706BA):RPC 服务器不可用。 (来自 HRESULT 的异常:0x800706BA