#!/bin/bash
input="packages.csv"
while IFS=',' read -r col1 col2 col3 dummy
do
array+=("$col1")
array+=("$col2")
array+=("$col3")
done < <(tail -n +2 "$input")
option=$(dialog --checklist --output-fd 1 "Choose packages:" 10 60 4 "${array[@]}")
exitstatus=$?
if [ $exitstatus = 0 ]; then
echo "$option"
else
echo "Cancel"
fi
Principais alterações:
-
tail -n +2 "$input"
para remover o cabeçalho; -
dummy
variable para permitir mais de três colunas (colunas extras não importam paradialog
); - uma variável
array
para criar entrada paradialog
em vez de muitos que transmitem dados de maneira paralisada; -
"${array[@]}"
como uma maneira correta de passar array como argumentos de linha de comando nesse caso; -
--output-fd 1
explicou nesta resposta (existem soluções melhores e mais robustas); - variáveis minúsculas por esta resposta .
Actually in my
.csv
file I have more than 3 columns but bash checklist expects 3 arguments. Is it possible to somehow include them in the checklist?
Para quê? Verdade, dialog --checklist
espera-os três por três. Mantenha tudo limpo. Eu acho que talvez você precise de mais colunas para o seu código que vem após dialog
. Considere isto: quando dialog
retorna com sucesso os identificadores da primeira coluna e você os tem em $option
, analise sua saída assim:
for package in $option; do … ; done
(Para isso, sua primeira coluna em packages.csv
não pode conter espaços, etc.)
Desta forma, você pode fazer algo para cada pacote escolhido. Dentro deste loop, você pode ler quantas colunas precisar, mas primeiro grep
para a linha correta:
IFS=',' read -r col1 col2 col3 col4 col5 col6 dummy < <(grep "^${package}," "$input")
(Dica: investigue read -a
, veja help read
). E depois, ainda dentro do loop, faça o resto do seu trabalho.