Se você quiser testar esse argumento de função equivalente a alguma string, você deve usar a construção if [ "$x" == "string" ] , então seu código será parecido com:
test () {
if [ "$1" == "toto" ] then
return 1
elif [ "$1" == "tata" ] then
return 4
fi
}
main () {
test "tata"
if [ $? -ne 1 ] then
echo "somecode"
fi
}
main "$@"
E você pode usar test name para a função. Se você quiser chamar builtin test , use builtin test construct.
E tome cuidado com = (atribuição) e == (comparação). Dentro do teste [ e ] o operador = funciona como == e testa a igualdade da cadeia (não os números).
set -o errexit sai imediatamente após o comando retornar diferente de zero (sem êxito). Seu ninja retorna 1 (que é diferente de zero) e sai.
Seu código sem testes não está funcionando porque if declaração tenta executar instruções e determinar o estado de saída do comando: se o estado de saída for zero (sucesso), execute instruções após then till elif de fi .