You'll find that "stepping through my script, inspecting the system after every line": That's the classical job of a debugger!
How to debug a bash script? has quite a few options (and I've used none of them. If you prefer the command line, this answer mentions and illustrates bashdb; sadly the reference documentation seems offline, but the man page seems available. The bad news is that it's not available for any debian, fedora, suse and was dropped from Ubuntu nearly a decade ago, which often is an indication of packaging trouble. Might have become much better!
Assuming this holds true:
could you tell us what the most complex bash script that you want to run is? Is it really just one command after the other, as your choice of words "a list of bash commands" suggests? or might it involve calling bash functions (and would you want that function to be one "command" or "step" through the function's contents as well? how deeply?) or even loops like for f in *.mp3; do id3tag "$f"; done?
@MarcusMüller Yes, they're simple commands. Almost all will be "mv file1 file2" commands.
Alternatively, you could just start an interactive shell after every line. A line gets executed, you do whatever you want to do (and quit the "inspection" shell through ctrl+d or exit), and the next line gets executed.
You can do something like (assuming GNU sed, which is more likely than BSD sed for someone who asks about GNU bash):
sed \
's/.*/echo "Next line is:"\ncat << END_ORIGINAL\n&\nEND_ORIGINAL\nbash -i;&;echo "Last line was:"\ncat << END_ORIGINAL\n&\nEND_ORIGINAL\n\n/' \
originalscript.sh > steppablescript.sh
which is a way to take each original line (matching the whole line with .*), surround it in a HEREDOC with
<< delimiter_string
&
delimiter_string
outputting that through cat (which is a horrible way to not have to figure out how to correctly quote the line). (& in sed refers to "replace this with the whole match", i.e. here with the original line)
Then, it runs an interactive bash (bash -i); then it the actual line (& again!), then it outputs the "last line" through the same trick as before.
you can then run steppablescript.sh as you would have originalscript.sh.
for f in *.mp3; do id3tag "$f"; done?