LinuxForum.Fans
Тема

Написал свой первый серьёзный скрипт. Хочу подвергнуть его критике...

Автор: bk-201 11 сообщений 3532 просмотров
#232065

Доброго времени суток!

Совсем недавно начал программировать под linux. По началу делал все руками.
1) Создавал каталог для проекта
2) Там создавал файлы
3) Сам писал Makefile

Захотелось автоматизировать выше описаные действия.
Получился следующий скрипт.

text

########################################## Фукнции скрипта ########################################## 
function EnterNameFolder ()
{
    # Предлагаем пользователю ввести имя директории, которую нужно создать
    echo -n "Введине имя директории: "
    read folder
    echo
}

function AnalizName () { # Проверяем корректность введенной строки: # Запрещается использовать специальные символы. # А именно: * ? [ ] { } > < | ; & $ ! ( ) ` ~ # \ " ' # Также запрещается испльзование пробела local str=${1//[\*,\?,\[,\],\{,\},\>,\<,\|,\;,\&,\$,\!,\(,\),\`,\~,\#,\\,\",\',\/," "]/""}

if [ $str = $1 ] # Если строчки одинковы then return 1 else # Если строчки разные return 0 fi }

function CreateWriteFiles () { local exe_file="" while true do echo -n "Введите имя исполняемого файла: " read exe_file if [ -n $exe_file ] # Если введена не пустая строка then AnalizName $exe_file if [ $? -eq 0 ] # Если указано некорректное имя файла then echo echo "Вы указали не корректное имя исполняемого файла." exe_file="main" echo "Имя исполняемого файла установлено по умолчанию: $exe_file" echo fi # Если указано корректное имя файла # Создаем файлы и записываем в них следующее содержимое (подготавливаем шаблоны) touch main.cpp echo "int main()" >> main.cpp echo "{" >> main.cpp echo >> main.cpp echo " return 0;" >> main.cpp echo "}" >> main.cpp

touch Makefile echo "main: main.o" >> Makefile echo " g++ main.o -o $exe_file" >> Makefile echo >> Makefile echo "main.o: main.cpp" >> Makefile echo " g++ -c main.cpp" >> Makefile echo >> Makefile echo "clean:" >> Makefile echo " rm -rf *.o" >> Makefile echo " rm -rf $exe_file" >> Makefile

touch ReadMe echo "Автор: " >> ReadMe echo "Описание: " >> ReadMe break fi done }

########################################## Начало скрипта ##########################################

while true do # Добавить проверку аргументов. EnterNameFolder if [ -n $folder ] # Если строка не пустая. then AnalizName $folder

if [ $? -eq 0 ] # Если имя директории введено некорректно. then echo "Вы указали неправильное имя директории. Повторите ввод." continue fi # Если название директории введено правильно. # Удостоверимя, что директории с таким именем нет. if [ -d ~/ProgC++/$folder ] then echo "Дитерктория с таким именем уже существует." echo -n "Хотите указать новое имя? (y\n) :: " read choise if [ $choise = "y" ] then continue else break fi fi # Создаем директорию mkdir ~/ProgC++/$folder echo "Директории ~/ProgC++/$folder успешно создана." echo cd ~/ProgC++/$folder CreateWriteFiles break fi done

Хотелось бы услышать советы по оптимизации.
И, если вы делали что-то подобное, увидеть ваши варианты решения данной проблемы.

Заранее большое спасибо! smile

#237200

1. А почему запрещено использовать пробелы в названии директории и файла?
2. Код:

text
                echo "int main()" >> main.cpp
                echo "{" >> main.cpp
                echo >> main.cpp
                echo "    return 0;" >> main.cpp
                echo "}" >> main.cpp 

можно упростить до:

text
echo "int main()
{ 

return 0; }" >> main.cpp

Так нагляднее. Соответственно и для других файлов можно переделать.
3. Скрипт обычно начинается с Sha-bang, чтобы было ясно чем его интерпретировать. Добавь #!/bin/bash в первую строку скрипта.

#237207
bk-201 написал:
echo -n "Введине имя директории: "
read folder

первая команда лишняя, help read

bk-201 написал:
if [ "$str" = "$1" ]

кавычки забыли. Исправил. ну и согласен с Vascom на тему запрещённых символов.

bk-201 написал:

if [ $str = $1 ] # Если строчки одинковы
then return 1
else # Если строчки разные return 0
fi

выходить из тела if и из цикла по return - моветон.
Просто

text
    [ "$str" != "$1" ]
}

команда [ вернёт 0 если не равны, и не ноль если равны. Это число и будет кодом возврата функции. Bash и так зело тормозной, и его просто необходимо оптимизировать.

bk-201 написал:
if [ -n $exe_file ]

опять кавычки забыли. И да, -n тут не нужно.

bk-201 написал:
if [ $? -eq 0 ]

никогда не юзайте все эти eq и прочую ересь. В данном случае строчки можно сравнивать как строчки

text
[ $? == 0 ]

А если нужно как цифры, то пишите

text
(( X < Y + 12 ))

или типа того

bk-201 написал:
AnalizName $exe_file
if [ $? -eq 0 ]
# Если указано некорректное имя файла

вы сами такого не поймёте через 5 минут. Можно просто:

text
if AnalizName $exe_file 
then
    # Если указано некорректное имя файла

Кстати по логике AnalizName должна выдавать "Успех", если указано корректное имя файла. У вас почему-то наоборот. Впрочем это на работоспособность не влияет конечно.

bk-201 написал:
touch main.cpp

во первых это лишнее, во вторых используйте встроенные документы bash (googl.it)

bk-201 написал:
break

зря вы так сделали. Цикл на самом деле маленький, большинство кода фактически в тело цикла НЕ входит. Т.к. вы выходите из неё из цикла.

bk-201 написал:
if [ $choise = "y" ]

вот здесь кавычки не там. "y" можно без кавычек, а переменную нельзя. Ну и конечно [ "$c" == "y" -o "$c" == "Y" ] принято...

Vascom написал:
можно упростить до:
echo "int main()

ну сойдёт и так на первое время. Потом пойдут кавычки в кавычках, и начнётся АДЪ.

#237233
bk-201 написал:
Хотелось бы услышать советы по оптимизации.

Подготовка:
1) Сделать скелет проекта из нужных файлов и каталогов
2) tar jcf ~/templ1.tar.bz2 ./

Использование:
3) mkdir my_new_project ; cd my_new_project ; tar xf ~/templ1.tar.bz2

ps. Да, вы поняли правильно, это намёк на то, что выбран инструмент не по задаче.

#237235

Ну задача в изучении bash в том числе, видимо.

#237284
Vascom написал:
можно упростить до:
echo "int main()
{

return 0;
}" >> main.cpp

Так нагляднее. Соответственно и для других файлов можно переделать.

а ещё лучше так :
cat >main.cpp <<EOF
int main()
{

return 0;
}
EOF

bk-201 написал:
read folder

вместо этого лучше передать скрипту параметры... остальное вроде сказали уже...

#237479

Всем большое спасибо)
Буду капать дальше)

#237482
Vascom написал:
echo "int main()
{

return 0;
}" >> main.cpp

Так нагляднее. Соответственно и для других файлов можно переделать.

Привык соблюдать отступы, чтобы код было удобно читать...
А тут возникает пробела с этим. Ведь в файл запишется все то, что находится между кавычками.
Может есть еще предложения, как решить эту проблему?

drBatty написал:
bk-201 пишет:

break

зря вы так сделали. Цикл на самом деле маленький, большинство кода фактически в тело цикла НЕ входит. Т.к. вы выходите из неё из цикла.

Не совсем понял, цикл у меня бесконечный ( как сделать иначе не придумал ) и выйти мен из него как-то надо. Как обойтись без break?

bormant написал:
ps. Да, вы поняли правильно, это намёк на то, что выбран инструмент не по задаче.

Да, полностью согласен) Просто очень захотелось написать именно это, да и, к сожалению, не возникало пока других задач.

#237488
bk-201 написал:
Не совсем понял, цикл у меня бесконечный ( как сделать иначе не придумал ) и выйти мен из него как-то надо. Как обойтись без break?

я не про количество. Просто код перед break надо вынести за пределы цикла. Потому-что логически он и так за его пределами.

#237489
bk-201 написал:
Может есть еще предложения, как решить эту проблему?

в посте №6 всё наглядно рассказано.

#237501
drBatty написал:
[quote=bk-201]Не совсем понял, цикл у меня бесконечный ( как сделать иначе не придумал ) и выйти мен из него как-то надо. Как обойтись без break?

я не про количество. Просто код перед break надо вынести за пределы цикла. Потому-что логически он и так за его пределами.[/quote]

Теперь все понял smile Спасибо!

Войдите или зарегистрируйтесь, чтобы ответить.