O que a saída faz em um bloco if em um script de shell?

4

Eu tenho uma pergunta sobre o shell script unix.

Digamos que você faça exit 1 no interior if : sairá ou ainda executará o% externoif? O seguinte é um exemplo fictício.

if [ "$PASSWORD" == "$VALID_PASSWORD" ]; then
    if [ "$PASSWORD" -gt 10]; then
        echo "password is too large!"
        exit 1
    fi
    echo "You have access!"
    exit 1
fi
    
por jamesT 23.10.2012 / 11:13

3 respostas

5

exit é geralmente um shell embutido, então, em teoria, depende de qual shell você está usando. No entanto, não conheço nenhum shell em que ele opera além de sair do processo atual. Da página man bash,

   exit [n]
          Cause the shell to exit with a status of n.  If  n  is  omitted,
          the exit status is that of the last command executed.  A trap on
          EXIT is executed before the shell terminates.

Portanto, ela não termina simplesmente a cláusula if atual, ela sai do shell inteiro (ou processo, em essência, já que o script está sendo executado dentro de um processo de shell).

Do homem sh,

 exit [exitstatus]
        Terminate the shell process.  If exitstatus is given it is used as
        the exit status of the shell; otherwise the exit status of the
        preceding command is used.

E por último, do man ksh,

   † exit [ n ]
          Causes  the  shell  to exit with the exit status specified by n.
          The value will be the least significant 8 bits of the  specified
          status.   If  n  is omitted, then the exit status is that of the
          last command executed.  An end-of-file will also cause the shell
          to  exit  except for a shell which has the ignoreeof option (see
          set below) turned on.
    
por 23.10.2012 / 12:09
8

exit termina o processo de chamada. Na maioria das circunstâncias, isso encerra todo o script, mesmo que você o chame de dentro de um loop, uma função ou um script incluído. As únicas construções de shell que “capturam” exit são aquelas que introduzem um subshell (ou seja, um bifurcado processo de shell filho):

  • a construção de subconsulta básica (…) que executa o comando dentro dos parênteses em uma subshell;
  • a construção de substituição de comandos $(…) (e seu equivalente descontinuado, as backquotes '…' ), que executa um comando e retorna sua saída como uma cadeia de caracteres;
  • trabalhos em segundo plano bifurcados com & ;
  • o lado esquerdo de um canal | e o lado direito como bem na maioria dos shells (ATT ksh e zsh sendo as exceções);
  • alguns shells possuem outras construções de subprocesso, por exemplo, substituição de processo <(…) , >(…) , etc., em ksh, bash e zsh.

Você pode sair de um loop while ou for com a palavra-chave break e pode sair de uma função com a palavra-chave return .

    
por 24.10.2012 / 01:35
0

exit terminará o script completamente.

break irá um nível mais alto em loops - mas não em if-statements (de acordo com minha bash-manpage).

    
por 23.10.2012 / 23:00