I suggest you have a look at
sed # to manipulate text output from, for instance, ls
and
xargs # to use some std input to generate (many) new command lines
in combination with piping the output of one command into the input of the next (like from ls to sed to xargs)
To wit, say, you have a directory with *tif and *tfw file. You want to do something to the tif files using the corresponding tfw file. Let's also assume for every tif file there is a tfw file of the exact same name
# list all those tif files in one long column
ls -1 *.tif
# chop of the end .*tif leaving you with the base name
ls *.tif | sed -s 's/\.tif$//'
# feed the previous into xargs to tag a tif with the info in a tfw and
# create new geo_*.tif file
ls *.tif | sed -s 's/\.tif$//' | xargs -i -t geotifcp -e {}.tfw {}.tif geo_{}.tif
The latter line might pretty much do what you need in one long (difficult to read) commandline without scripting.
To aid understanding you can also first create the file list as you did:
ls *tif> output.list
Then clean it up with sed to make sure it behaves well.
sed -s 's/\.tif$//' output.list > clean_output.list
end then use xargs with option -p instead of -t to get a prompt before the issuance of each command:
cat clean_output.list | xargs -i -p geotifcp -e {}.tfw {}.tif geo_{}.tif
EDIT:
A variation on the former is to use more sed less xargs. This is also a bit more 'debuggable'. It does require you to learn a bit about regular expressions (which is well worth the effort).
Essentially, one can generate the text of your desired command entirely with sed
sed -s 's/\(.*\)\.tif$/geotifcp -e \1.tfw \1.tif geo_\1.tif/' output.list > process.sh
I know, regex looks horrible but here is the rough explanation of the content in the single quotes:
's/A/B/' substitutes A with B
A in our case is (something).tif (note that we have to escape the brackets)
The something is stored in \1 and gets used to build the geotifcp command (which is B).