bash se problemas de instrução [Error == Error]: não encontrado [duplicado]

1
    

Esta pergunta já tem uma resposta aqui:

    

Toda vez que eu executo meu script, a seguinte declaração if me fornece o erro;

script.sh: [Error==Error]: not found

ou

script.sh: [Error==-2]: not found

if ["$P1"=="$P2"];then
            echo $name
fi

Eu tentei outras versões

    if ["$P1"=="$P2"]
            then
            echo $name
    fi

e

    if [[ "$P1" == "$P2" ]]
            then
            echo $name
fi

P1="Error"
P2="$(sed -n '1p' somefile.txt)"

somefile.txt pode conter um número ou uma string

    
por pyler 01.11.2014 / 04:04

2 respostas

6

Os espaços são significativos. Use:

if [ "$P1" = "$P2" ]

O que deu errado

Quando o shell vê ["$P1"=="$P2"] , ele o interpreta como uma única palavra e procura um comando que corresponda a essa palavra. Como esse comando não existe, você recebe a mensagem de erro not found .

    
por 01.11.2014 / 04:11
2

Atribuição ( = ) nos scripts bash é também comparar o operador no bash.

Veja este exemplo:

if [ "$a" = "$b" ]

Observeos espaço em branco que enquadra o = . Neste caso, estamos comparando "$a" e "$b" .

if [ "$a"="$b" ] is not equivalent to the above.

Teste com o exemplo:

kasiay@kasiyaPC~:$ a=2
kasiay@kasiyaPC~:$ b=3

Em seguida, executamos if [ "$a" = "$b" ]; then echo "equal"; else echo "not equal"; fi , o resultado é " não igual " e é um resultado verdadeiro.

Mas se esfregamos if [ "$a"="$b" ]; then echo "equal"; else echo "not equal"; fi , o resultado é " igual " e o resultado é errado !!

Por que neste caso estamos errados?

Quando estamos usando if [ "$a"="$b" ] , ele é analisado como if [ A_TOKEN ] , então, neste caso, a condição if sempre retorna um resultado verdadeiro. por exemplo:

if [ "$a"="$b" ]; then    echo "TRUE"; fi
#result is TRUE

if [ 2=3 ]; then    echo "TRUE"; fi
#result is TRUE    

if [ anything ]; then    echo "TRUE"; fi
#result is TRUE

Tanto = como == são comparações de strings.

The == comparison operator behaves differently within a double-brackets test than within single brackets.

[[ $a == z* ]]   # True if $a starts with an "z" (pattern matching).
[[ $a == "z*" ]] # True if $a is equal to z* (literal matching).

[ $a == z* ]     # File globbing and word splitting take place.
[ "$a" == "z*" ] # True if $a is equal to z* (literal matching).

links: Operadores de comparação

Onde você está usando uma declaração errada?

Em if ["$P1"=="$P2"];then , deve ser if [ "$P1" == "$P2" ];then . Espaços em torno de == e também depois e antes de colchetes.

    
por 01.11.2014 / 08:23

Tags