简单的shell程序问题。。。。

笑羽酣天 2010-08-11 12:49:11
我有这样一个shell,取名叫A.sh,它要调用shell B.sh
在B.sh中有三条指令分别我B1,B2,B3
但B1失败后,会返回$?值为1

问题:
我在执行A.sh时,希望的是,B.sh中不管那条指令错误,都退出A.sh和B.sh,程序不再往下走
但是当B.sh中的B1失败后会返回$?值为1,它接着执行B2,B3那么我在A.sh中收到的$?值还是0——为B3成功的返回值,这样我退不出程序,请问我如何获得B.sh的总的状态返回值?

我不想再每个指令后都有判断退出,以为实际中我用太多的shell和太多的指令,不可能每句后都有判断退出与否的

请教大虾们,谢谢,十万火急~~~!
...全文
112 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
steptodream 2010-08-11
  • 打赏
  • 举报
回复
但是当B.sh中的B1失败后会返回$?值为1,它接着执行B2,B3那么我在A.sh中收到的$?值还是0——为B3成功的返回值
-----------------------------
只要B1 B2 B3有一条返回$?值为1 你就以非0状态退出1啊!
比如B1执行失败后会返回$?值为1 你就在B里直接exit 1
笑羽酣天 2010-08-11
  • 打赏
  • 举报
回复
这个问题搞定了。呵呵,谢谢
我的qq:80106051
quanhao8 2010-08-11
  • 打赏
  • 举报
回复
学习下~~~~~
steptodream 2010-08-11
  • 打赏
  • 举报
回复
楼上的代码里 哪个是A.sh 哪个是B.sh? 我白天上不了QQ
笑羽酣天 2010-08-11
  • 打赏
  • 举报
回复
我想问下,如果我在A.sh中:

#!/bin/sh
test 3 -eq 2 || return 1


我在B.sh中如何接受到A.sh返回的值?

我是这样接受的,但是是什么都没有:
#!/bin/sh

echo "********************* configtemplate **************************"
token=`./1test.sh`
echo --------token=$token


token为空,为什么,没有我返回的值哦。
另外你的QQ是多少,可以加下好友吗?
steptodream 2010-08-11
  • 打赏
  • 举报
回复
B

#!/bin/sh
mailfolder=/000home/simon/example.data || exit 1
[ -r "$mailfolder" ] || { echo "Can not read $mailfolder" ; exit 1; }
echo "$mailfolder has mail from:"
grep -q "^from " $mailfolder || exit 1
笑羽酣天 2010-08-11
  • 打赏
  • 举报
回复
恩, 是的,那个地方我写错了,因为之前做测试,忘了改过来。

可是我感觉一个脚本里有好多这样的if——fi感觉好冗杂啊,
有没有简洁的方法
steptodream 2010-08-11
  • 打赏
  • 举报
回复
你的判断条件有问题哦 $?=0表示执行成功了 非0表示命令执行出错误
笑羽酣天 2010-08-11
  • 打赏
  • 举报
回复
B.sh中的代码假如是这样的:



#!/bin/sh
mailfolder=/000home/simon/example.data
if [ $?=0 ];then
ruturn $?
exit 1
fi
[ -r "$mailfolder" ] || { echo "Can not read $mailfolder" ; exit 1; }
if [ $?=0 ];then
ruturn $?
exit 1
fi
echo "$mailfolder has mail from:"
grep "^from " $mailfolder
if [ $?=0 ];then
ruturn $?
exit 1
fi


******************************************************************************

A.sh中的代码是这样的:


#!/bin/sh
echo "********************* configtemplate **************************"
cd /home/simon
./B.sh
if [ $?!="0" ];then
echo 1
fi
echo "****Test****“



是这样的吗?
steptodream 2010-08-11
  • 打赏
  • 举报
回复
对啊,我的意思是,如果B.sh中的B1错的话,就不要走了,返回到A.sh中,A.sh接到返回错误的状态,终止程序执行,这样的。
------------------
所以你就必须在B1后添加一句判断之类的 让B以非0退出 要不然他怎么退出?B一执行结束 A里就捕获到B的退出状态了!
这不跟别的语言一样么?在需要返回的地方return 然后调用的地方根据返回值来判断一些东西。
笑羽酣天 2010-08-11
  • 打赏
  • 举报
回复
对啊,我的意思是,如果B.sh中的B1错的话,就不要走了,返回到A.sh中,A.sh接到返回错误的状态,终止程序执行,这样的。
steptodream 2010-08-11
  • 打赏
  • 举报
回复
按你4楼说的 B里的B1执行错了 你不马上退出的话 B还会继续执行B2 B3 那不就等于把B的执行完了 可是你问的问题说的是 B.sh中不管那条指令错误,都退出A.sh和B.sh 这不矛盾么?
steptodream 2010-08-11
  • 打赏
  • 举报
回复
那样可能吗?下面是一段vsftpd的启动脚本里的代码 不一样是在每个条件的地方加入了exit!

start() {
# Start daemons.

[ -x /usr/sbin/vsftpd ] || exit 4

CONFS=`ls /etc/vsftpd/*.conf 2>/dev/null`
[ -z "$CONFS" ] && exit 6
for i in $CONFS; do
site=`basename $i .conf`
echo -n $"Starting $prog for $site: "
daemon /usr/sbin/vsftpd $i
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
echo
done
return $RETVAL
}
笑羽酣天 2010-08-11
  • 打赏
  • 举报
回复
关键的是,我不想在B.sh中队每个命令逐个判断,都写这样的,
我想做的是,只要B.sh中有一条失败,我在A.sh中退出,也终止B.sh
yzx714 2010-08-11
  • 打赏
  • 举报
回复
B1退出后如果返回值为1就exit啊~
steptodream 2010-08-11
  • 打赏
  • 举报
回复
B1 || exit 1
B2 || exit 1
B3 || exit 1

或者
RETVAL=0
B1 || RETVAL=1
B2 || RETVAL=1
B3 || RETVAL=1
exit $RETVAL

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧