A script is an interpreted computer program. That is, a program that can be executed by another program (an executable called an interpreter) without first being translated into another language. A script written in a particular language needs an interpreter that understands that language.
A makefile is a script. It is interpreted by some version of Make. The language of makefiles is designed to be used in build systems, invoking shell commands to build files out of other files. It can do other things, but generally not as easily as other languages that are more general or designed with those things in mind.
Where and when to use which tool is a very broad question. Broadly speaking, Make is a good tool for building files from other files, and keeping them up to date. Other languages may be better for other purposes, such as computation, stream editing or regular expression handling.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…