Что бросилось в глаза воспалённому мозгу:
1. Нет проверки на пустое либо уже существующее $NAME_OF_PROJECT
2. Нет проверки на валидность NAME_OF_PROJECT в качестве имени домена. (Как минимум отсутствие пробелов надо проверить.)
3. Не стоит мешать макросы баша и реальные пути в одном флаконе. Если так хочется создать проект в домашке текущего юзера - используй переменную $HOME, но используй её везде, чтобы не получилось непойми что в итоге.
4. ServerAlias ... я стараюсь не указывать ServerName и ServerAlias в одной конфигурации. Разве что я АБСОЛЮТНО уверен, что мне НЕОБХОДИМО получить доступ к ОДНОМУ сайту под РАЗНЫМИ именами. (Например svn.mylocaldomain.lan(=192.168.ну-ты-понял) и svn.rootdir.org(=реальный-белый-IP-адрес).)
Для остальных сайтов пишу заглушку в стиле
<VirtualHost *:80>
ServerName www.example.org
Redirect permanent / http://example.org/
</VirtualHost>
прямо в том же самом файле сайта, вторым блоком.
5. add_to_hosts_conf - а если на этот IP в файле уже есть строчка с другим содержанием?... Поведение системы при нахождении множественных вхождений одного IP в файле hosts не определено. И вообще насиловать файл hosts как-то некультурно. DNS сервер себе заведи уже, что ли, раз массово занимаешься этим делом.
6. Лучше всё таки использовать рекомендованную капитализацию в конфигах апача. Читать приятнее. Я имею в виду VirtualHost, ибо в остальных местах у тебя почему-то всё миленько...

7. Не проще тупо создать БД с именем проекта и не заморачиваться?
8. pwgen же ж.
9. Не стоит давать права WITH GRANT OPTION без ОЧЕНЬ уважительной на то причины. Особенно не стоит давать ВСЕ права с правом передачи.
10. На сколько я помню изменения в последних релизах Ubuntu, файл настройки сайта для апача должен иметь расширение .conf. Хотя это ограничение тривиально обходится правкой одной строчки в конфиге...
11. Делать апачу рестарт необходимо только при изменении набора модулей и в редких случаях при изменении конфигурации некоторых модулей. В остальных случаях достаточно reload.
12. Второй скрипт вообще неполезный. a2dissite достаточно.
13. #указываем владельца и права на папку "public"
ХыДе?
chown -R $USER:www-data "$HOME/www/$NAME_OF_PROJECT"
chmod -R u=rwX,g=rsX,o= "$HOME/www/$NAME_OF_PROJECT/public"
chmod o+X "$HOME" "$HOME/www" "$HOME/www/$NAME_OF_PROJECT"