Script de bash - problema na lista de verificação de caixas de diálogo

0

Estou tentando escrever um script bash para automatizar a instalação de meus pacotes. Então a ideia é ler um arquivo .csv (packages.csv) como este:

pkg,Description,option
wget,file downloader,on
curl,tool to transfer data from or to a server,on
nano,text editor for Unix-like computing systems,off
emacs,An extensible customizable free/libre text editor — and more,on

construa uma matriz para cada coluna (sem cabeçalho) e depois passe os arrays para uma lista de verificação de caixa de diálogo.

#!/bin/bash

input="packages.csv"
while IFS=',' read -r col1 col2 col3
do 
    for a in $col1; do
        array_col1+=("$a") 
    done

    for b in $col2; do
        array_col2+=("$b")
    done

    for c in $col3; do
        array_col3+=("$c")
    done        

done < "$input"

array1=("${array_col1[@]:1}")
array2=("${array_col2[@]:1}")
array3=("${array_col3[@]:1}")

let num=${#array2[*]}-1

for i in $(seq 0 $num); do
    list[i]=$(echo ${array1[i]} ${array2[i]} ${array3[i]})
done

OPTION=$(dialog --checklist "Choose packages:" \
10 60 4 \
${list[*]})
exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "$OPTION"
else
    echo "Cancel"
fi

Eu consegui trabalhar em algum momento, mas sem espaços na descrição. Depois que fiz algumas alterações para incluir os espaços, não funciona. Como posso consertar isso? Na verdade, no meu arquivo .csv eu tenho mais de 3 colunas, mas a lista de verificação do bash espera 3 argumentos. É possível incluí-los de alguma forma na lista de verificação?

    
por coverflower 20.04.2018 / 17:05

1 resposta

1
#!/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 para dialog );
  • uma variável array para criar entrada para dialog 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.

    
por 20.04.2018 / 20:20

Tags