Souvik
Souvik

Reputation: 1279

How to exit from a method in shell script

I am new to shell scripting and stuck with a problem. In my shell method if I saw any validation issue then rest of the programm will not execute and will show user a message. Till validation it's done but when I used exit 0 then only it comes out of the validation loop not from full method.

config_wuigm_parameters () {
    echo "Starting to config parameters for WUIGM....." | tee -a $log
    prepare_wuigm_conf_file
    echo "Configing WUIGM parameters....." | tee -a $log
    local parafile=`dirname $0`/wuigm.conf
    local pname=""
    local pvalue=""
    create_preference_template

    cat ${parafile} |while read -r line;do
        pname=`echo $line | egrep -e "^([^#]*)=(.*)" | cut -d '=' -f 1`
        if [ -n "$pname" ] ; then
            lsearch=`echo $line | grep "[<|>|\"]" `
                         if [ -n  "$lsearch" ] ; then
                echo validtion=$lsearch
                            echo "< or > character present , Replace < with &lt; and > with &gt;"
                exit 1;
                        else
                pvalue=`echo $line | egrep -e "^([^#]*)=(.*)" | cut -d '=' -f 2- `
                echo "<entry key=\"$pname\" value=\"$pvalue\"/>" >> $prefs
                echo "Configured : ${pname} = ${pvalue} " | tee -a $log
            fi
        fi
    done
    echo $validtion
    echo "</map>" >> $prefs
    # Copy the file to the original location
    cp -f $prefs /root/.java/.userPrefs/com/ericsson/pgm/xwx
    # removing the local temp file
    rm -f $prefs
    reboot_server   
}

Any help would be great

Upvotes: 1

Views: 122

Answers (2)

clt60
clt60

Reputation: 63952

It is because the construction

cat file | while read ...

starts a new (sub)shell.

In the next you can see the difference:

echoline() {
    cat "$1" | while read -r line
    do
        echo ==$line==
        exit 1
    done
    echo "Still here after the exit"
}

echoline $@

and compare with this

echoline() {
    while read -r line
    do
        echo ==$line==
        exit 1
    done < "$1"
    echo "This is not printed after the exit"
}

echoline $@

Using the return doesn't helps too, (because of subshell). The

echoline() {
    cat "$1" | while read -r line
    do
        echo ==$line==
        return 1
    done
    echo "Still here"
}

echoline $@

will still prints the "Still here".

So, if you want exit the script, use the

while read ...
do
   ...
done < input    #this not starts a new subshell

if want exit just the method (return from it) must check the exit startus of the previous command, like:

echoline() {
    cat "$1" | while read -r line
    do
        echo ==$line==
        exit 1
    done || return 1
    echo "In case of exit (or return), this is not printed"
}

echoline $@
echo "After the function call"

Instead of || or you can use the

[ $? != 0 ] && return 1

just after the while.

Upvotes: 3

Alexis Wilke
Alexis Wilke

Reputation: 20790

You use the return instruction to exit a function with a value.

return [n]

Causes a function to exit with the return value specified by n. If n is omitted, the return status is that of the last command executed in the function body. If 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. If used out‐side a function and not during execution of a script by ., the return status is false. Any command associated with the RETURN trap is executed before execution resumes after the function or script.

If you want to exit a loop, use the break instruction instead:

break [n]

Exit from within a for, while, until, or select loop. If n is specified, break n levels. n must be ≥ 1. If n is greater than the number of enclosing loops, all enclosing loops are exited. The return value is 0 unless n is not greater than or equal to 1.

The exit instruction exits the current shell instead, so the current program as a whole. If you use sub-shells, code written between parenthesis, then only that sub-shell exits.

Upvotes: 1

Related Questions