To protect themselves from accidentally deleting files, some users create a "trash" directory somewhere, and then write a "safe delete" program that, instead of rming a file, moves it into the trash directory. The implementation can be quite complex, but a simple alias will do most of what you want:
alias del "mv \!* ~/trash"
Of course, now your deleted files collect in your trash directory, so you have to clean that out from time to time. You can do this either by hand or automatically, via aentry like:
23 2 * * * cd $HOME/trash && rm -rf *
This deletes everything in the trash directory at 2:23 a.m. daily. To restore a file that you deleted, you have to look through your trash directory by hand and put the file back in the right place. That may not be much more pleasant than poking through your garbage to find the tax return you threw out by mistake, but (hopefully) you don't make lots of mistakes.
There are plenty of problems with this approach. Obviously, if you delete two files with the same name in the same day, you're going to lose one of them. A shell script could (presumably) handle this problem, though you'd have to generate a new name for the deleted file. There are also lots of nasty side effects and "gotchas," particularly if you want an rm -r equivalent, if you want this approach to work on a network of workstations, or if you use it to delete files that are shared by a team of users.
Unfortunately, this is precisely the problem. A "safe delete" that isn't really safe may not be worth the effort. A safety net with holes in it is only good if you can guarantee in advance that you won't land in one of the holes. You can patch some of the holes by replacing this simple alias with a shell script. But you can't fix all of them. For a real solution, see Jonathan Kamens' article on.