Quando e quando não usar operadores [] com if?

1
#!/bin/bash
echo 'Want Task 1'
read r1 ;
if [ echo "${r1}" | grep -iq "^y" ] ; then
    echo 'Task One Done'

    echo 'Want Task 2 ??'
    read r101
    if [ echo "${r101}" | grep -iq "^y" ] ; then 
        echo 'Task 2 Done'
    fi
fi

Quando executo o código acima, ocorre erro ao dizer

[: missing ']' grep: ]: No such file or directory

Mas quando simplesmente omito os colchetes [ e ] , o código é executado perfeitamente. Eu sei que esse [] é um comando de teste, mas não sei quando usá-lo e quando não.

E também, por favor, esclareça se eu devo chamar isso de [] "operador" ou test "comando"

Nota lateral, se necessário, estou usando o Bash no terminal do GNOME.

    
por GypsyCosmonaut 06.07.2017 / 19:29

2 respostas

2

O uso do pipe permite que os comandos sejam executados em subshells diferentes, portanto, você recebe a mensagem de erro, pois os dois comandos ( [ e grep ) estão incompletos (os respectivos não funcionam como esperado).

Se você quiser apenas testar o código de resultado de um programa, não precisará usar [ … ] ou test , você precisará deles apenas para uma comparação mais distinta, como [ 1 -gt 2 ] ou [ "$1" == "$2" ] . Se você quiser comparações ainda mais avançadas, como o uso de expressões regulares, use o comando [[ … ]] , consulte Construções de Teste  e Uma breve introdução às expressões regulares no 'Guia avançado de script de script'

    
por 06.07.2017 / 19:38
1

Aqui está outra sugestão para um script que fará o mesmo:

#! /bin/bash
read -p 'Want Task 1 ' 
if [ "${REPLY^}" = Y ] ; then
    echo 'Task One Done'

    read -p 'Want Task 2 ?? '
    if [ "${REPLY,}" = y ] ; then 
        echo 'Task 2 Done'
    fi
fi

A variável padrão para read é $REPLY . Ao usar ${REPLY^} , você obterá o conteúdo em maiúsculas e, com ${REPLY,} , ficará em minúsculas. Como a variável pode estar vazia, você precisa das " entre aspas.

Se você realmente quiser chamar um programa externo como grep , pode fazer assim:

read -p 'Want Task 1 ' 
if echo $REPLY | grep -icq ^y ; then
        echo 'Task 1 Done'
fi

O que realmente acontece acima é que nós executamos um comando e se o valor de saída não for 0, é verdade. Este exemplo mostrará:

if /bin/true ; then
    echo We have always the yes hat on
fi

E [ é apenas um programa chamado /usr/bin/test . Procure em man test .

    
por 06.07.2017 / 21:20