我正在 bash 4 提示符下运行命令,以收集拉取 AWS SSM 运行文档输出的 AWS CLI 命令的输出。我可以让它以多种格式输出,包括文本或 json(默认)。到目前为止,我尝试将此输出放入一个数组中,以便我可以循环输出,直到数组中的每个值等于 2 或更高,但尚未成功。
#!/bin/bash
aws ec2 reboot-instances --instance-ids `aws ec2 describe-instances --filters "Name=tag:RebootGroup,Values=01" --query 'Reservations[].Instances[].InstanceId' --output text`
sleep 30
completeLoop=false
while [ ! ${completeLoop} ]
do
ssmID=$(aws ssm send-command --document-name "AWS-RunPowerShellScript" --document-version "1" --targets '[{"Key":"tag:RebootGroup","Values":["01"]}]' --parameters '{"commands":["$wmi = Get-WmiObject -Class Win32_OperatingSystem ","$uptimeMinutes = ($wmi.ConvertToDateTime($wmi.LocalDateTime)-$wmi.ConvertToDateTime($wmi.LastBootUpTime) | select-object -expandproperty \"TotalMinutes\")","[int]$uptimeMinutes"],"workingDirectory":[""],"executionTimeout":["3600"]}' --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region us-west-2 --output text --query "Command.CommandId")
declare -a a
readarray -t upTimeArray <<< $(aws ssm list-command-invocations --command-id "$ssmID" --details --output json | jq '.CommandInvocations[].CommandPlugins[].Output')
if [[ " ${upTimeArray[@]} " -gt 5 ]]; then
echo "Uptime is greater than 5 minutes."
completeLoop=true
else
completeLoop=false
fi
done
我在这里取得了一些进展,但现在我试图弄清楚如何从输出中删除回车/新行。
这是我的数组简化为仅输出数组中项目的值。我假设我需要使用 sed 从每行中删除 '\r\n' 但我在这样做时遇到了麻烦。
declare -a a
readarray -t upTimeArray <<< $(aws ssm list-command-invocations --command-id "$ssmID" --details --output json | jq '.CommandInvocations[].CommandPlugins[].Output')
for i in "${upTimeArray[@]}"
do
echo $i
done
正在返回以下内容
"1\r\n"
"1\r\n"
我需要它为每一行只返回“1”,这样我就可以迭代数组,直到每行等于 2 或更大。
编辑#2
我在此处提供的帮助下取得了进展,但最终完全解决了第二个问题中的问题和脚本问题https://stackoverflow.com/questions/65362975/bash-aws-cli-trying-to-figure-out-how-to-validate-an-array-of-uptimes-with-2-ch
答案1
你实际上从未进入循环:
$ completeLoop=false
$ while [ ! $completeLoop ]; do date; done; echo complete
complete
[
当给定单个参数(搁置!
和尾随]
)时,如果参数不为空,该命令将返回成功。 “真”和“假”都不为空。
true
要对和命令的实际布尔结果执行操作false
,请省略[
:
completeLoop=false
count=0
# ....vvvvvvvvvvvvvvv
while ! "$completeLoop"; do
echo in loop
(( ++count == 5 )) && completeLoop=true
done
echo complete
in loop
in loop
in loop
in loop
in loop
complete
你要
readarray -t upTimeArray < <(
aws ssm list-command-invocations --command-id "$ssmID" --details --output json |
sed $'s/\r$//' |
jq -r '.CommandInvocations[].CommandPlugins[].Output'
)
使用 sed 删除尾随回车符(自动处理换行符),并jq -r
输出不带引号的“原始”值。
我正在从一个重定向流程替代而不是这里的字符串。结果相同。
$(...)
为了可读性,可以在里面添加额外的空格