আপনার সমস্যা নেস্ট লুপ নয়, প্রতি সে। এটি এমন যে আপনার এক বা একাধিক অভ্যন্তরীণ লুপগুলি সাব-শেলের মধ্যে চলছে ।
এইটা কাজ করে:
#!/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...)
সমাধান এখানে; আপনাকে সাব-শেলগুলিতে চলমান অভ্যন্তরীণ লুপগুলির রিটার্ন মানটি পরীক্ষা করতে হবে:
#!/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!
সম্পাদনা করুন: আপনি কী সাবচেলে রয়েছেন তা যাচাই করতে, আপনার বর্তমান শেলের প্রসেস আইডি কী তা জানাতে "উত্তর" স্ক্রিপ্টটি সংশোধন করুন। দ্রষ্টব্য: এটি কেবল ব্যাশে 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
"আই" এবং "জে" ভেরিয়েবলগুলি আপনার জন্য ফোর্টরানের সৌজন্যে এনেছে। আপনার দিনটি শুভ হোক. :-)
bash -c 'for x in y z; do exit; done; echo "This never gets printed"'
।