Если Истинные Заявления в Bash - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь запустить команду, используя AWS CLI, а затем установить вывод этой команды в переменную, что было достаточно просто. Я проанализировал начальную команду с помощью jq, и в результате получился массив имен GroupNames, который был именно тем, что я хотел. Теперь я пытаюсь выполнить оператор if, который говорит, что если $ 1 находится в list_groups: распечатать пользователей в этой группе. Моя проблема в два раза. Я не знаю, является ли вывод первой команды доступным для чтения, потому что он не в указанном формате c.

#!/bin/bash


list_groups=$(aws iam list-groups --output json | jq -r .'Groups[] | .GroupName' --output json)
echo $list_groups

if ${1} == $list_groups;
then
echo aws iam get-group --group-name $1 --output json

else 
echo 'sorry'
fi

Итак, я пытаюсь взять переменную list_groups, в которой я сохранил выходные данные этой команды CLI, а затем с пользовательским вводом в $ 1 посмотреть, находится ли то, что я ввел, в этом GroupName и использует ли это $ 1, чтобы затем распечатать пользователей внутри этой группы шоу в команде ниже.

echo aws iam get-group --group-name $1 --output json 

Извините, я не могу напечатать здесь свой вывод для имен групп, которые я получаю от первой команды, поскольку она чувствительна, но вот пример.

Admin Users assets.dev assets.prod

Как вы можете видеть, здесь нет разделяющих значений, и я не уверен, что это способствует возникновению проблем.

Если бы я хотел выполнить эту команду здесь, я бы набрал

bash accounts_parse.sh Admin

Я получаю ошибку:

command not found

Спасибо всем за помощь, и я уточню, не соответствует ли мое объяснение или требуется дополнительная информация.

Ответы [ 2 ]

2 голосов
/ 27 января 2020

if ${1} == $list_groups;

Это не так, если работают операторы в bash (и других оболочках POSIX).

Слово, которое следует после if это команда , которую нужно выполнить, и ее состояние выхода оценивается, и если оно равно 0, берется ветвь if.

Это объясняет вашу «команду не найдена» - она ​​пытается выполнить ${1} в качестве команды, и у вас нет команды «Администратор».

Используйте либо

if [ "${1}" = "$list_groups" ]

, либо

if [[ "${1}" = "$list_groups" ]]

, последняя является bashism (с некоторыми улучшениями) и не будет работать в других совместимых оболочках. «==» также доступен как расширение bash, но полностью эквивалентно «=», поэтому я бы посоветовал просто использовать его.

Важно то, что [ является команда (обычно встроенная, также доступная как "test"). Это не специальный бит синтаксиса, а вещь, которая выполняется с аргументами и возвращает статус. ([[ имеет некоторую специальную обработку и более синтаксически-y, но концептуально это все еще "вещь для выполнения")

0 голосов
/ 27 января 2020

Вы можете использовать read встроенный bash:

read user _ < <(aws iam list-groups --output json | jq -r .'Groups[] | .GroupName' --output json)

if [[ $user == $1 ]]; then
   echo aws iam get-group --group-name $1 --output json
else 
   echo 'sorry'
fi

read user _ будет читать первое слово из ввода в переменную user и игнорировать оставшиеся.

...