O problema é sua declaração case
, como você disse. Isso sempre será verdadeiro, já que qualquer variável, por definição, sempre coincide:
case $opt in
$opt)
. . .
Portanto, independentemente do valor que você der, ele sempre executará o mesmo bloco case
. Eu realmente não tenho certeza do que você está tentando fazer, mas eu acho que você estava apontando para algo assim:
#!/bin/bash
## Enable extended globbing for the +(...) pattern
shopt -s extglob
clear
# define variables
NOW=$(date +%F-%a-%H.%M) # year-month-date-day-hour.minute format
# display region list menu
region=($(aws ec2 describe-regions |
jq -r '.Regions[].RegionName'))
aws ec2 describe-security-groups --region "$region" | jq -r '.SecurityGroups[].GroupId' > "$region.txt"
PS3="Select Region number: "
## make a dummy array which includes the values
validOptions=${region[0]};
for ((i=1; i<${#region[@]}; i++)); do
validOptions="$validOptions|${region[i]}"
done
select opt in "${region[@]}" "exit"
do
case $opt in
## This uses bash's +(pat1|pat2) syntax which matches
## one or more of the |-separated strings.
+($validOptions))
echo "Valid!"
aws ec2 describe-security-groups --region "$region" |
jq -r '.SecurityGroups[].GroupId' > "$region.txt"
# read security groups file into array and create
# individual json files
mkdir -p "$region"
while read group; do
echo "Processing group: $group"
aws ec2 describe-security-groups --region "$region" --group-ids "$group" > "${region}/${group}-${DATE}.json"
done < "$region.txt"
break
;;
"exit")
echo "Exiting..."
exit
;;
*)
echo "Invalid option $opt, try again..."
esac
done