funciona como um comando, mas não como um script de shell. Por quê?

2
$ grep "apple" fruits.txt
apple
$ if [ $? == 0 ] ; then echo "A"; else echo "B"; fi
A

Quando eu executo os comandos acima ele funciona bem, mas quando executo esses comandos como um shell script, ele lança um erro e imprime B. Por que isso acontece?

$ sh temp.sh 
apple
temp.sh: 3: [: 0: unexpected operator
B
    
por san1512 30.05.2015 / 01:58

2 respostas

4

O problema é que você está usando == como o operador de igualdade (que o bash suporta), mas depois executa o script em sh , que não o suporta. A solução é substituir:

if [ $? == 0 ] ; then echo "A"; else echo "B"; fi

Com:

if [ $? = 0 ] ; then echo "A"; else echo "B"; fi

Isso funcionará sob bash e simples sh .

Embora possa não fazer diferença neste caso específico, = é uma comparação de strings. Para testar a igualdade numérica, deve-se usar -eq :

if [ $? -eq 0 ] ; then echo "A"; else echo "B"; fi

Exemplo com ==

Considere este arquivo de script:

$ cat script.sh
grep "apple" fruits.txt
if [ $? == 0 ] ; then echo "A"; else echo "B"; fi

Ele é executado sob o bash:

$ bash script.sh
apple
A

Ele falha em traço (dash é o padrão sh em sistemas parecidos com o debian):

$ dash script.sh
apple
script.sh: 2: [: 0: unexpected operator
B

Com exceção do número da linha, você pode ver que essa mensagem de erro corresponde ao que você está vendo.

Simplificações

Não há necessidade de acessar $? diretamente. O código pode ser simplificado para:

$ if grep "apple" fruits.txt; then echo "A"; else echo "B"; fi
apple
A

Ou usando os operadores lógico-e, && e lógico-ou, || ,

grep "apple" fruits.txt && echo A || echo B

Os trabalhos acima porque echo A , se executado, sempre retornará sucesso.

    
por 30.05.2015 / 02:14
3

Uma opção é executá-lo como um script bash, assim como o ambiente local com o qual você está comparando

Para o script ser executado sob o bash, coloque-o como a primeira linha do programa:

#!/usr/bin/env bash
    
por 30.05.2015 / 02:52

Tags