ปัญหาของคุณไม่ใช่ลูปซ้อนกัน นั่นคือการวนซ้ำภายในของคุณอย่างน้อยหนึ่งครั้งกำลังทำงานใน subshell
งานนี้:
#!/bin/bash
for i in $(seq 1 100); do
        echo i $i
        for j in $(seq 1 10) ; do
                echo j $j
                sleep 1
                [[ $j = 3 ]] && { echo "I've had enough!" 1>&2; exit 1; }
        done
        echo "After the j loop."
done
echo "After all the loops."
เอาท์พุท:
i 1
j 1
j 2
j 3
I've had enough!
นี่แสดงปัญหาที่คุณอธิบาย:
#!/bin/bash
for i in $(seq 1 100); do
        echo i $i
        cat /etc/passwd | while read line; do
                echo LINE $line
                sleep 1
                [[ "$line" = "daemon:x:2:2:daemon:/sbin:/sbin/nologin" ]] && { echo "I've had enough!" 1>&2; exit 1; }
        done
        echo "After the j loop."
done    
echo "After all the loops."
เอาท์พุท:
i 1
LINE root:x:0:0:root:/root:/bin/bash
LINE bin:x:1:1:bin:/bin:/sbin/nologin
LINE daemon:x:2:2:daemon:/sbin:/sbin/nologin
I've had enough!
After the j loop.
i 2
LINE root:x:0:0:root:/root:/bin/bash
LINE bin:x:1:1:bin:/bin:/sbin/nologin
LINE daemon:x:2:2:daemon:/sbin:/sbin/nologin
I've had enough!
After the j loop.
i 3
LINE root:x:0:0:root:/root:/bin/bash
(...etc...)
นี่คือทางออก; คุณต้องทดสอบค่าส่งคืนของลูปภายในที่ทำงานใน subshells:
#!/bin/bash
for i in $(seq 1 100); do
        echo i $i
        cat /etc/passwd | while read line; do
                echo LINE $line
                sleep 1
                [[ "$line" = "daemon:x:2:2:daemon:/sbin:/sbin/nologin" ]] && { echo "I've had enough!" 1>&2; exit 1; }
        done
        err=$?; [[ $err != 0 ]] && exit $err
        echo "After the j loop."
done
echo "After all the loops."
หมายเหตุการทดสอบ: [[ $? != 0 ]] && exit $?
เอาท์พุท:
i 1
LINE root:x:0:0:root:/root:/bin/bash
LINE bin:x:1:1:bin:/bin:/sbin/nologin
LINE daemon:x:2:2:daemon:/sbin:/sbin/nologin
I've had enough!
แก้ไข: เพื่อตรวจสอบว่าคุณอยู่ใน subshell ใดให้แก้ไขสคริปต์ "answer" เพื่อบอกคุณว่า ID กระบวนการของเชลล์ปัจจุบันของคุณคืออะไร หมายเหตุ: ใช้งานได้เฉพาะในทุบตี 4:
#!/bin/bash
for i in $(seq 1 100); do
        echo pid $BASHPID i $i
        cat /etc/passwd | while read line; do
                echo pid $BASHPID LINE $line
                sleep 1
                [[ "$line" = "daemon:x:2:2:daemon:/sbin:/sbin/nologin" ]] && { echo "I've had enough!" 1>&2; exit 1; }
        done
        err=$?; [[ $err != 0 ]] && echo pid $BASHPID && exit $err
        echo "After the j loop."
done
echo "After all the loops."
เอาท์พุท:
pid 31793 i 1
pid 31796 LINE root:x:0:0:root:/root:/bin/bash
pid 31796 LINE bin:x:1:1:bin:/bin:/sbin/nologin
pid 31796 LINE daemon:x:2:2:daemon:/sbin:/sbin/nologin
I've had enough!
pid 31793
ตัวแปร "i" และ "j" ได้รับความอนุเคราะห์จาก Fortran ขอให้มีความสุขมาก ๆ ในวันนี้นะ :-)
               
              
bash -c 'for x in y z; do exit; done; echo "This never gets printed"'มันไม่เพียงแค่พยายาม