我想清理一些代码,因为我想清理每个命令后的检查返回代码状态检查。如果命令失败,我将mid函数返回到父函数。 如果我将这个代码放在一个函数中,那么没有任何反应,因为return命令将在new-child函数中。
确实有些想法。
现状:
a(){
for i in $(cat file.txt)
do
scp $i hostb:/tmp/
if [ $? -ne 0 ]
then
print_failed "SCP failed."
return 1
fi
done
}
所需:
a(){
for i in $(cat file.txt)
do
scp $i hostb:/tmp/
# continue as usuall unless return code is not 0
check_status $?
done
}
check_status(){
if [ $1 -ne 0 ]
then
print_failed "SCP failed."
return 1
fi
}
答案 0 :(得分:2)
据我所知,如果子函数失败,则没有隐式方式从父函数返回。
我能想到的最接近的事情就是这样:
a () {
while read -r source # don't read lines with "for"!
do
check_status scp "$source" hostb:/tmp/ || return 1
done < file.txt
}
check_status () {
if ! "$@"
then
print_failed "SCP failed."
return 1
fi
}
check_status
的作用是执行命令并在失败消息失败时打印失败消息。它还返回1
,因此父函数也可以使用if !
或||
返回。
除了使用全局变量之外,没有办法从父函数返回,如果可能的话,我个人会避免使用它。
说实话,我没有看到你对此有什么好处:
a () {
while read -r source
do
if ! scp "$source" hostb:/tmp/
then
print_failed "SCP failed."
return 1
fi
done < file.txt
}