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).