Como posso ignorar o resto de um script sem sair do shell invocando, quando adquirem o script?

3

Eu tenho um script bash, onde eu chamo exit em algum lugar para pular o restante do script quando getopts não reconhece uma opção ou não encontra um argumento de opção esperado.

while getopts ":t:" opt; do
    case $opt in
        t)
            timelen="$OPTARG"
            ;;
        \?) printf "illegal option: -%s\n" "$OPTARG" >&2
            echo "$usage" >&2
            exit 1
            ;;
        :) printf "missing argument for -%s\n" "$OPTARG" >&2
           echo "$usage" >&2
           exit 1
           ;;
    esac
done

# reset of the script

Eu source o script em um shell bash. Quando algo está errado, o shell sai.

Existe alguma forma diferente de exit para pular o resto do script, mas sem sair do shell de chamada?

A substituição de exit por return não funciona como em uma chamada de função, e o restante do script será executado.

Obrigado.

    
por Tim 02.08.2018 / 16:45

3 respostas

2

Use return .

O retorno bash builtin sairá do script de origem sem interromper o script de chamada (pai / fonte).

Do homem bash:

return [n]
Causes a function to stop executing and return the value specified by n to its caller. If n is omitted, the return status is that of the last command executed in the function body. … If return is used outside a function, but during execution of a script by the . (source) command, it causes the shell to stop executing that script and return either n or the exit status of the last command executed within the script as the exit status of the script.

    
por 02.08.2018 / 18:37
2

Você pode simplesmente agrupar seu script em uma função e usar return da maneira como descreve.

#!/bin/bash
main () {
    # Start of script
    if [ <condition> ]; then
        return
    fi
    # Rest of the script will not run if returned
}

main "$@"
    
por 02.08.2018 / 17:04
1

return exite scripts de origem (e funções) .

No seu caso:

while getopts ":t:" opt; do
    case $opt in
        t)
            timelen="$OPTARG"
            ;;
        \?) printf "illegal option: -%s\n" "$OPTARG" >&2
            echo "$usage" >&2
            return 1
            ;;
        :) printf "missing argument for -%s\n" "$OPTARG" >&2
           echo "$usage" >&2
           return 1
           ;;
    esac
done

Exemplo de teste:

$ cat script1.sh
echo script1
source ./script2.sh
echo script1 ends
$ cat script2.sh
echo script2

while true; do
    return
done

echo script2 ends
$ bash script1.sh
script1
script2
script1 ends

Também o sourcing script2.sh faz diretamente a coisa correta (sem sair da sessão atual do shell):

$ source script2.sh
script2
    
por 02.08.2018 / 18:26