Loop de script Bash para aumentar os parâmetros

1

Eu quero usar whiptail para gerar uma lista de seleção com base na saída de outro programa. Somente a primeira palavra em cada linha da saída do primeiro programa é necessária, então eu a extraio usando awk .

Para saber mais sobre como o bash lida com matrizes, usei este link por tldp . Eu tenho como verificar o tamanho das matrizes de aqui .

Isso não é executado como esperado, mas se eu copiar a saída echo e digitar " whiptail " na frente, isso funciona.

Como faço para corrigir este código para que ele funcione?

exemplo program.sh :

#! /bin/bash
find ./  -printf "%f\n"

exemplo mainscript.sh :

#! /bin/bash
MYARRAY=($(./program.sh -l | awk '{print $1;}'))
MYPARAMS=" --checklist \"\" 15 40 5"
i=0
while [[ $i -lt ${#MYARRAY[@]} ]]
do
        MYPARAMS+=" \"${MYARRAY[$i]}\" \" \" off"
        i=$[$i+1]
done
whiptail $MYPARAMS
echo $MYPARAMS
exit
    
por USERID_UNK 28.11.2014 / 19:27

2 respostas

1

Não é uma solução muito desejável, mas você pode usar eval :

eval whiptail $MYPARAMS

Eu suspeito que o problema é a citação. No entanto, você pode construir MYPARAMS como uma matriz e funcionará como esperado:

#! /bin/bash
MYARRAY=($(./program.sh -l | awk '{print $1;}'))
MYPARAMS=( --checklist "" 15 40 5 )
i=0
while [[ $i -lt ${#MYARRAY[@]} ]]
do
        MYPARAMS+=( "${MYARRAY[$i]}" " " off )
        i=$[$i+1]
done
whiptail "${MYPARAMS[@]}"
echo "${MYPARAMS[@]}"
exit
    
por 28.11.2014 / 19:53
1

Por que você transformou MYPARAMS em uma string e não em array? Como MYPARAMS é uma string como --checklist "" 15 40 5 "foo1" " " off , a linha de comando whiptail $MYPARAMS do shell resulta em whiptail sendo chamado com os argumentos --checklist , "" (uma string que consiste em duas aspas duplas), 15 , 40 , 5 , "foo1" , " , " e off . Quando você deixa uma expansão variável sem aspas, seu valor é dividido em campos em cada seqüência de espaço em branco, e os campos resultantes são tratados como padrões de caractere curinga que são expandidos se corresponderem a qualquer arquivo. Aspas pertencem à sintaxe do shell, elas são apenas expandidas pelo analisador do shell, não como parte da expansão da variável.

Você pode invocar o analisador de shell com o eval builtin, mas é difícil obter a cotação correta. Seria especialmente difícil se os itens pudessem conter caracteres que não se encaixam na sintaxe da shell.

Uma matriz é o caminho certo para armazenar uma lista de strings. Supondo que você tenha definido com sucesso MYARRAY para a lista de tags que deseja usar, é possível fazer o loop dessa matriz para criar a matriz de parâmetros.

MYPARAMS=()
for t in "${MYARRAY[@]}"; do
  MYPARAMS+=("$t" " " "off")
done
whiptail "${MYPARAMS[@]}"
    
por 29.11.2014 / 23:59