A leitura aninhada falha

1

Eu tenho uma lista de nomes de arquivos em um arquivo e quero fazer o usuário decidir o que fazer com cada um. No bash, iterar sobre nomes de arquivos não é trivial por si só, então eu segui esta resposta :

#!/bin/bash

while IFS= read -r THELINE; 
do
  read -n 1 -p "Print line? [y/n] " answer;
  if [ ${answer} = "y" ];
  then
    echo "${THELINE}";
  fi;
done < tester;

Quando tento executar isso (em um arquivo não vazio), recebo um erro no if :

line 5: [: =: unary operator expected

Meu melhor palpite é que answer não está configurado corretamente, o que seria causado pelo uso de duas chamadas de read de uma forma "aninhada", já que as seguintes operações funcionam como esperado:

#!/bin/bash

for THELINE in $(cat "tester");
do
  read -n 1 -p "Print line? [y/n] " answer;
  if [ ${answer} = "y" ];
  then
    echo "${THELINE}";
  fi;
done;

O que está acontecendo aqui?

Eu corro bash 4.2.24(1)-release (x86_64-pc-linux-gnu) em 3.2.0-37-generic #58-Ubuntu x86_64 GNU/Linux .

    
por Raphael 24.02.2013 / 16:58

2 respostas

3

Primeiro, o erro de [ é porque answer está vazio, portanto, [ vê três argumentos: = , y e ] . Sempre coloque aspas duplas em torno das substituições de variáveis: if [ "$answer" = "y" ] .

O motivo $answer está vazio fd 0 está ocupado com a entrada do arquivo devido ao redirecionamento <tester durante o loop while.

while IFS= read -r line <&3
do
    read -n 1 -p "Print line? [y/n] " answer
    if test "$answer" = "y"
    then
        echo "$line"
    fi
done 3< tester
    
por 24.02.2013 / 17:27
-1

Experimente if [ x${answer} = "xy" ]; . test precisa de algo antes de =

    
por 28.11.2013 / 16:33