They are all scripting/programming languages (well bash is an interpreter). At a high level they all do the same thing, i.e. allow you to do things programatically.
In real world use-cases, people tend to use them for different things, sometimes due to convention, sometimes due to the environment (e.g. bash is often
useful for Linux environments, but not always necessarily for a windows environment).
makefiles are often ideal for organizing your steps to build your app (e.g. compile, link, etc). tcl is ideal for writing modules of arbitrary code, maybe for extending an
existing app for instance, or writing a complete app. Perl does a similar thing, but has some strengths for character manipulation. bash is an interpreter, but you can
write scripts for that too. Again, these are essentially instructions. Often used to set up an environment for (say) coding or for (say) beginning your testing, etc.