Meta
Estou usando whiptail
para permitir que o usuário insira senhas em arquivos que são usados em conjunto com envsubst
alguns arquivos de modelo.
whiptail
lista de controle
para renderizar coisas whiptail
eu uso o seguinte:
declare -A availableServices=(
[grafana]="Grafana Dashboard"
[influxdb]="InfluxDB v1.x TSDB"
[node-red]="Node-RED Flow UI"
[portainer]="Portainer Container Mgmt"
)
# Render TUI
function askGenerateCredential() {
local message="Set Password for particular Service\n
Press <SPACEBAR> to Select \n
Press <Enter> to Skip
"
local arglist=()
# Generate a String for Whiptail Checkboxes
# FORMAT: "<INDEX> <DESCRIPTION> <OFF>"
for index in "${!availableServices[@]}";
do
# Default all Services are NOT-Selected (OFF)
arglist+=("$index" "${availableServices[$index]}" "OFF")
done
SELECTED_SERVICES+=$($WHIPTAIL --title "Available Services within Populo" \
--notags --separate-output \
--ok-button Next \
--nocancel \
--checklist "$message" $LINES $COLUMNS $(( LINES - 12 )) \
-- "${arglist[@]}" \
3>&1 1>&2 2>&3)
}
o SELECTED_SERVICES
é um array declarado como
declare -a SELECTED_SERVICES=()
A renderização funciona bem, porém tenho uma if else
condição específica no meu script que não consegue executar comandos específicos com base no serviço selecionado no array acima.
askGenerateCredential
if [ -z "$SELECTED_SERVICES" ]; then
echo "No Services were selected. Exiting..."
exit 1
else
for service in "${SELECTED_SERVICES}";
do
if [ "$service" == "influxdb" ]; then
echo "Setting Credentials for InfluxDB"
setInfluxDBCredentials
elif [ "$service" == "grafana" ]; then
echo "Setting Credentials for Grafana"
setGrafanaCredentials
elif [ "$service" == "node-red" ]; then
echo "Setting Credentials for node-RED"
setNodeRedCredentials
elif [ "$service" == "portainer" ]; then
echo "Setting Credential for Portainer"
setPortainerCredentials
fi
done
fi
Ao adicionar o bloco acima, meu script sai com 0
código quando seleciono vários valores por meio da whiptail
interface do usuário. Pelo contrário, quando seleciono apenas um valor na interface do usuário, a respectiva função é chamada.
O que eu estou fazendo errado aqui? Desejo que dependendo da service
variável, a respectiva função seja chamada e não saia do script.
Código
#!/bin/env bash
WHIPTAIL=$(which whiptail)
if [ -z $WHIPTAIL ]
then
echo "This script requires whiptail to render the TUI."
exit 1
fi
declare -a SELECTED_SERVICES=()
LINES=$(tput lines)
COLUMNS=$(tput cols)
declare -A availableServices=(
[grafana]="Grafana Dashboard"
[influxdb]="InfluxDB v1.x TSDB"
[node-red]="Node-RED Flow UI"
[portainer]="Portainer Container Mgmt"
)
function askGenerateCredential() {
local message="Set Password for particular Service\n
Press <SPACEBAR> to Select \n
Press <Enter> to Skip
"
local arglist=()
# Generate a String for Whiptail Checkboxes
# FORMAT: "<INDEX> <DESCRIPTION> <OFF>"
for index in "${!availableServices[@]}";
do
# Default all Services are NOT-Selected (OFF)
arglist+=("$index" "${availableServices[$index]}" "OFF")
done
SELECTED_SERVICES+=$($WHIPTAIL --title "Available Services within Populo" \
--notags --separate-output \
--ok-button Next \
--nocancel \
--checklist "$message" $LINES $COLUMNS $(( LINES - 12 )) \
-- "${arglist[@]}" \
3>&1 1>&2 2>&3)
}
function setInfluxDBCredential() {
echo "set admin password env var for influxdb"
}
function setGrafanaCredential() {
echo "set admin password env var for grafana"
}
function setNodeRedCredential() {
echo "set admin password env var for node-REd"
}
function setPortainerCredential() {
echo "set password file for portainer"
}
askGenerateCredential
if [ -z "$SELECTED_SERVICES" ]; then
echo "No Services were selected. Exiting..."
exit 1
else
for service in "${SELECTED_SERVICES}";
do
if [ "$service" == "influxdb" ]; then
echo "Setting Credentials for InfluxDB"
setInfluxDBCredentials
elif [ "$service" == "grafana" ]; then
echo "Setting Credentials for Grafana"
setGrafanaCredentials
elif [ "$service" == "node-red" ]; then
echo "Setting Credentials for node-RED"
setNodeRedCredentials
elif [ "$service" == "portainer" ]; then
echo "Setting Credential for Portainer"
setPortainerCredentials
fi
done
fi
EDITAR
Por sugestão, tentei ${SELECTED_SERVICES[@]}
no loop for e adicionei um echo "$service"
que é capaz de percorrer a matriz, mas as if
condições não são acionadas.
Eu acredito que a lógica em sua
askGenerateCredential()
função não está fazendo o que você quer que ela faça. Atualmente, toda a saída do seu comando whiptail está sendo adicionada à matriz como um único elemento. Se você quiser vários elementos divididos em novas linhas, você deve alterá-lo para algo assim:Consulte 4.2 Comandos internos do Bash
Além disso, você está chamando
SELECTED_SERVICES
como uma variável em vez de uma matriz.Você precisa alterar:
para:
Como está, você expandirá apenas o primeiro elemento da matriz. No entanto, como seu código é escrito
SELECTED_SERVICES
, receberá apenas um único elemento.Veja 6.7 Matrizes
Além disso, case provavelmente seria melhor usado em vez da construção if/elif. Algo como: