Bash

無法建構 bash 數組以驗證來自 aws cli 命令 json 輸出的正常執行時間值

  • December 21, 2020

我正在從 bash 4 提示符執行命令,以收集 AWS CLI 命令的輸出,這些命令提取 AWS SSM 執行文件的輸出。我可以讓它以多種格式輸出,包括文本或 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-使用 2-ch 驗證正常執行時間數組

你從來沒有真正進入循環:

$ 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輸出不帶引號的“原始”值。

我從程序替換而不是此處字元串重定向。結果相同。

可以在內部添加額外的空格$(...)以提高可讀性

引用自:https://unix.stackexchange.com/questions/620158