我是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 < and > with >"
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
}
任何帮助都会很棒
答案 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退出。