Tenho recebido erros em meus scripts ao usar este operador. Eu tenho alguma documentação on-line e o dobro de iguais supostamente deve funcionar. Alguma ideia?
Guia de referência Zsh: http://zsh.sourceforge.net/Doc/Release/Conditional-Expressions.html
Roteiro:
#!/bin/zsh
if [ $_user == "root" ]; then
echo "root"
else
echo "not root"
fi
Executando:
$ ./script.sh
./script.sh:3: = not found
Resposta simples: a
==
é um operador lógico apenas dentro[[ … ]]
de construções.E também funciona em ksh e bash.
Quando usado fora de uma
[[ … ]]
construção, um =cmd se torna um operador de expansão de nome de arquivo, mas apenas em zshIsso é o que acontece dentro da
[ … ]
construção mais simples que você usou.Mas a maneira correta de testar se o usuário que está executando o script de shell é root é fazer:
=cmd
é um operador de expansão de nome de arquivozsh
que se expande para o caminho docmd
(resolvido por uma pesquisa de$PATH
). Se nenhum comando for encontrado, isso resultará em um erro fatal, como quando os globs não correspondem.Então
==
, aqui em um argumento desse[
comando está pedindo ao shell para procurar o=
comando$PATH
ezsh
está dizendo que não existe isso=
em nenhum lugar.Aqui, use a sintaxe padrão para o
[
comando:Ou cite o
=
:Você também precisaria das aspas para correspondência de regex:
De qualquer forma, você gostaria de citar
$_user
ou obter algum erro confuso quando$_user
está vazio ou não definido (e pior, incluindo uma vulnerabilidade de injeção de comando arbitrária em shells semelhantes a Korn diferentes dezsh
(comobash
)).Você também pode desabilitar esse recurso desabilitando a
equals
opção (set +o equals
) que não é muito útil em scripts.Ou use a construção
ksh
-style[[...]]
:Ou uma
case
construção:(
[[ = ]]
,[[ == ]]
ecase
faça a correspondência de padrões (curinga, não regexp))Observe que essas são expressões condicionais, não há necessidade de desambiguar entre uma atribuição e um operador de igualdade, portanto, não há necessidade de um
==
operador.Uma resposta mais curta na tangente ..talvez você leia um exemplo criado para ser executado em outro tipo de shell?