如何退出shell脚本中的方法

时间:2014-05-30 06:46:26

标签: shell

我是shell脚本的新手,遇到了问题。在我的shell方法中,如果我看到任何验证问题,那么程序的其余部分将不会执行并向用户显示消息。直到验证它已经完成,但是当我使用exit 0时,它只是来自验证循环而不是来自完整方法。

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   
}

任何帮助都会很棒

2 个答案:

答案 0 :(得分:3)

这是因为施工

cat file | while read ...

启动一个新的(子)shell。

接下来你可以看到差异:

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

echoline $@

并与此比较

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

echoline $@

使用return也没有帮助,(因为子shell)。在

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

echoline $@

仍会打印“Still here”。

因此,如果要退出脚本,请使用

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

如果只想退出方法(从中返回)必须检查上一个命令的退出startus,如:

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"

而不是||或者您可以使用

[ $? != 0 ] && return 1

while之后。

答案 1 :(得分:1)

使用return指令退出带有值的函数。

  

return [n]

     

使函数以n指定的返回值退出。如果省略n,则返回状态是在函数体中执行的最后一个命令的状态。如果在函数外部使用,但在执行脚本期间。 (source)命令,它使shell停止执行该脚本并返回n或脚本中执行的最后一个命令的退出状态作为脚本的退出状态。如果在函数外部使用而不是在执行脚本期间使用,则返回状态为false。在函数或脚本之后执行恢复之前,将执行与RETURN陷阱关联的任何命令。

如果要退出循环,请改用break指令:

  

break [n]

     

从for,while,until或select循环中退出。如果指定了n,则中断n个级别。 n必须≥1。如果n大于封闭循环的数量,则退出所有封闭循环。除非n不大于或等于1,否则返回值为0.

exit指令改为退出当前shell,因此整个当前程序。如果你使用子shell,代码写在括号之间,那么只有那个子shell退出。