usando read inside if clause - bash

2

Eu tenho um script:

#!/bin/bash

if [[ read -t 10 -sp "Enter Password: " passwd ]]; then
    echo -e "\nPassword: ${passwd}"
else
    echo -e "\nInput timed out" >&2
    exit 1
fi

exit 0

Mas dá erro:

./script.sh: line 3: conditional binary operator expected
./script.sh: line 3: syntax error near '-t'
./script.sh: line 3: 'if [[ read -t 10 -sp "Enter Password: " passwd ]]; then'

O que há de errado com o meu código?

    
por Majid Azimi 19.02.2012 / 18:09

2 respostas

4

Você não precisa do [[ ... ]] . Basta reescrevê-lo como:

#!/bin/bash

if read -t 10 -sp "Enter Password: " passwd; then
  echo -e "\nPassword: ${passwd}"
else
  echo -e "\nInput timed out" >&2
  exit 1
fi

exit 0

ou para ser mais fácil de ler e / ou mais curto:

#!/bin/bash
read -t 10 -sp "Enter Password: " passwd || echo -e "\nInput timed out" >&2 && exit 1
echo -e "\nPassword: ${passwd}"
exit 0

Atualizar :

Para entender por que funciona sem [[ ... ]] , o homem bash deve ser verificado:

if list; then list; [ elif list; then list; ] ... [ else list; ] fi

The if list is executed. If its exit status is zero, the then list is executed. Otherwise, each elif list is executed in turn, [...]

Nesse caso, O if list é o comando de leitura. [ $? -eq 0 ] e test $? -eq 0 também são listas válidas com status de saída específico. [[ expression ]] (novamente de acordo com o homem de bash) também é uma lista válida, mas read -t 10 -sp "Enter Password: " passwd não é uma expressão válida. Veja o homem para saber o que são expressões válidas.

    
por 19.02.2012 / 19:06
2

Você está usando o comando dentro da instrução [[ ]] , o que não faz sentido. Este operador deve ser usado como a função test para verificar alguma condição.

É melhor executar o comando read separadamente e verificar o código de saída.

#!/bin/bash

read -t 10 -sp "Enter Password: " passwd

if [ $? -eq 0 ]; then
    echo -e "\nPassword: ${passwd}"
else
    echo -e "\nInput timed out" >&2
    exit 1
fi

exit 0
    
por 19.02.2012 / 18:45

Tags