Использование sed для удаления разрывов строк после выполнения команды и сохранения их в массиве - PullRequest
0 голосов
/ 14 апреля 2019

Я работаю над некоторыми предметами инвентаря и пытаюсь сохранить все регионы AWS в одном массиве, затем показал элементы один под другим, чтобы использовать его в качестве меню ввода.

Эта следующая командадает мне правильный вывод, но когда я иду в массив с FOR, длина массива только 1, потому что результат:

aws ec2 describe-regions --output text|awk -F\t '{print $3}'| sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g'

eu-north-1 ap-south-1 eu-запад-3 ес-запад-2 ес-запад-1 ap-северо-восток-2 ap-северо-восток-1 sa-восток-1 ca-центральный-1 ap-юго-восток-1 ap-юго-восток-2 eu-central-1 us-east-1 us-east-2 us-west-1 us-west-2

Вот как я заполняю массивы:

# Get regions
declare -a regions=$(aws ec2 describe-regions --output text | awk -F\t '{print $3}' |  sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /')
echo -e "\nPlease, select the region you would like to query: "

# Print Regions
len=${#regions[@]}
last=$((len+1))
for (( i=0; i<$len; i++ )); do
    echo -e "$i.${regions[$i]}\n" ;
    done
echo -e "$last All of them (this could take a while...O_o)\n"
read region_opt

if [${region_opt}!=${last}] then
    region=(${regions[$region_opt]})

Что я хочуиметь в выводе что-то вроде

  1. eu-north-1
  2. ap-south-1
  3. eu-west-3 ....

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

$() - это подстановка команд, просто конвертируйте любой стандартный вывод в строку и присваивайте его переменной
, если вы сказали true, что результат равен;
eu-north-1 ap-south-1 eu-west-3..., затем, чтобы получить массив из него, сделайтесинтаксически это выглядит так, а затем скажите Bash, чтобы он оценивался как таковой,

regions=($regions)

после раскрытия это будет допустимый синтаксис массива

 regions=(eu-north-1 ap-south-1 eu-west-3)

, тогда он будет оцениваться как действительный массив послеон заключен в "" и в качестве аргумента Bash eval

$ eval "regions=($regions)"
$ echo ${regions[0]}
eu-north-1

Так что я уверен, что вы сможете выполнить и решить его самостоятельно ...

0 голосов
/ 14 апреля 2019

Вам не хватает скобок вокруг значений массива, например,

declare -a ARRAY=(value1 value2 ... valueN)

(refs: https://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_10_02.html, https://www.gnu.org/software/bash/manual/bash.html)

Следующие формы также работают, и первая (без declare -a) приведена в качестве примера в справочном руководстве Bash GNU *, руководстве пользователя Bash для начинающих и Расширенное руководство по написанию сценариев bash :

ARRAY=(value1 value2 ... valueN)
declare ARRAY=(value1 value2 ... valueN)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...