In the end, bash is broken. The way that a shell process should process sigint, is to catch it, and to then stop all processing and wait for all pending forground processes to exit. realistically, there is no reason why SIGINT should not interrupt everything that is running in the foreground. this is why process groups were created ages ago. Every "command" that bash is given by the user should fork processes in the same pgroup and it's that pgroup that signals should be forwarded to. It should not be necessary to forward signals if pgroup is used correctly, because each process forked should have the same signal handling, by default, that bash has. nohup should cause all forked processes to have sighup == ignored.
There has been a lot of detail around the original unix shell signal handling and process relationships missed in bash. SIGINT to a shellscript in particular should flat out stop the entire shellscript, not break from loops which can just cause it to start more processing which can destroy files because previous work that did not finish due to the SIGINT.
Yes, the trap statement can help you exit more cleanly. But it was never required in original unix shell implementations. It was primarily a cleanup mechanism for temp file usage or other similar details. Now, it is required to make the shell exit when it should, and that makes it difficult to write dependable shell scripts which can easily be interrupted.
forandwhileloops are broken as thoughbreakwas executed.