Quero apenas comentar a parte mais importante:
if($category = $request)
Um shell if
funciona de outra forma, executando um comando e usando seu código de retorno.
Um exemplo é:
if /usr/bin/somecommand; then
echo "somecommand exited with exit code 0 (success)"
fi
para comparar duas strings, você usaria
if /bin/test a = b; then
echo "a=b"
fi
Note que test
pode ser embutido em seu shell, mas você geralmente também o possui como binário.
A próxima coisa é que você geralmente tem um link simbólico de /bin/[
para /bin/test
. Isso significa que você pode fazer:
if [ a = b ]; then
echo "a=b"
fi
em que [ a = b ]
é igual a test a = b
e o ]
está lá apenas para uma sintaxe mais agradável.
Esta é a razão, porque if [a=b]
não funciona, pois a sintaxe acima significa [ "a" "b" "]"
, onde [
é um nome de programa. Sem o espaço, o shell está procurando [a=b]
.
Sua sintaxe usando (a = b)
usa uma subshell para executar o comando dentro, resultando em um comando a = b
, onde a é considerado um nome de programa.
Outra possível armadilha do seu código é que as variáveis podem estar vazias. Dê uma olhada neste código:
b=something
if [ $a = $b ]; then
echo $a = $b
fi
Isso causará um erro, porque é equivalente a test = something
(executando test "=" "something"
). O echo
abaixo tem um problema semelhante, mas para o eco isso não importa muito. A maneira de corrigir isso é usar aspas apropriadas:
b=something
if [ "$a" = "$b" ]; then
echo "$a = $b"
fi
Resultando na linha de comando do teste: test "" "=" "something"
, que é um comando correto. Eu consertei problemas potenciais na linha de eco colocando a string inteira entre aspas, o que os torna um único parâmetro para o comando echo (ou interno).