Well... since you didn't bother to limit it to only "simple user tasks".....
for i in *
do
mv $i `echo $i | tr [:upper:] [:lower:]`
done
Done, all the files in that directory are now lower case.
Except:
- it fails with file names with spaces in them (which shouldn't be anything out of the blue)
- it fails with file names beginning with "-"
- it might overwrite in an unwanted way if two files exist with the same name but different case
- it warns when file is already lowercase
And that's just it. It's another case of "See how easy that was? Oh, we just need to add some quotes. Oh, and -- as an argument for mv. Oh, and -i as an argument for mv. But remember to put -i before --. Everybody knows that." - and yet you created a script that is a text book example of creating a fragile script.
Great default settings are of utter importance and the whole list of the default tools is much influenced by historic (and backwards compatible) reasons. It still leads to different interesting design cases:
- head and tail are extremely similar but have two different commands. GNU head can't even behave as tail with command switches.
- most people would want to create soft links (as opposed to hard links) in their daily routine but still have to go through ln -s instead of a command just for soft links. That is not unlike the -o loop example in GP, as a case of "yeah, you should obviously know that".