linux shell脚本:while循环中调用另一个脚本遇到exit为什么会跳出循环,且继续执行循环后的程序?

这里给出了for和while两种循环,及两种不同的结果:

#for循环如下,a.sh中for循环内调用b.sh,如下:

#a.sh如下:
#! /bin/sh -x
for i in $(seq 10)
do
echo "loop $i"
source b.sh
done
echo "end loop $i"

#b.sh如下
#! /bin/sh -x
echo "b.sh is process"
exit 1

#结果如下:
loop 1
b.sh is process

#while循环如下,a.sh中while循环内调用b.sh,其中all_file.txt中有大量文件目录

#a.sh如下:
#! /bin/sh
cat all_file.txt | while read line_a
do
echo "loop $i"
. b.sh
done
echo "end loop"

#b.sh如下

#! /bin/sh -x
echo "b.sh is process"
exit 1

结果如下:
loop
b.sh is process
end loop

问题:for直接跳出整个脚本,和baidu里搜的exit解答一样;
但是while循环只是跳出循环,继续执行循环后的程序。
请大神给出答案。
对b.sh中的exit改成#exit后可以继续循环;
能否给出不改动b.sh,还能循环。

第1个回答  2017-06-20
exit是在被调用的脚本里面,肯定会退出被调用的脚本了。如果不想继续执行while循环后面的程序可以在do后面的条件上加上break
第2个回答  2015-07-21
[root@localhost ~]# cat a.sh 
#! /bin/sh
while true
do
  echo "loop "
  #source ./b.sh
        exit 1
  #. ./b.sh
done
echo "end loop"
[root@localhost ~]# sh -x a.sh
+ true
+ echo 'loop '
loop 
+ exit 1

可以看出while也是可以exit的

不是while的错,是read的问题,exit 1是给了read,read读取不到东西结束循环。。。所以还会继续执行while后面的echo

追问

那请问,有办法不修改b.sh中的文件内容,还能继续循环么?

追答

没懂你的意思,我解释的是
cat all_file.txt | while read line_a


while true
对于exit 1系统做出的处理。。
和修改b.sh又是什么???

追问

我意思是想继续执行循环内的内容,不要让它跳出来。
我原来把b.sh中的exit进行删除,它会继续循环!有没有办法不删除exit,还可以继续完成整个循环。

追答

木有.....请正常逻辑写脚本,呵呵

第3个回答  2020-08-04
是source与.(点)的区别,把a.sh里的source b.sh改成./b.sh(b.sh的完整路径)就有了
相似回答