[ /tv/ /rf/ /vg/ /a/ /b/ /u/ /bo/ /fur/ /to/ /dt/ /cp/ /oe/ /bg/ /ve/ /r/ /mad/ /d/ /mu/ /cr/ /di/ /sw/ /hr/ /wh/ /lor/ /s/ /hau/ /slow/ /gf/ /vn/ /w/ /ma/ /azu/ /wn/ ] [ Main | Settings | Bookmarks | Music Player ]

No.44030 Reply
File: Install+gentoo_908c58_4993192.png
Png, 231.90 KB, 640×510 - Click the image to expand
edit Find source with google Find source with iqdb
Install+gentoo_908c58_4993192.png
Посмотрев доску по диагонали, я не нашёл ничего, посвящённого bash-скриптингу, посему быть. Спокойно, господа инженеры, сиё я осуществляю исключительно в целях самообразования и без малейшего шкурного интереса, а только лишь искреннего трудолюбия и развития ради, поэтому не переживайте по поводу существования более эффективных скриптовых языков. Здесь я, человек, который категорически отказывается связывать свою специальность или профессию с информационными технологиями, добродушный фритард-гуманитарий, буду просить помощи в написании одного проекта, на который я решился. Также приглашаю всех неравнодушных на беседу в этот bash-тред, и рекомендую эту требующую упорства настольную книгу:
http://www.tldp.org/LDP/abs/html/
http://www.tldp.org/LDP/abs/abs-guide.pdf

Итак, проект огромен, я неопытен, а значит, вопросов у меня будет много; но не всё сразу. Вот, первый, на ночь глядя:

Мой скрипт работает посредством вызова функций - множество отдельных мелких функций запрашивают от пользователя данные пошагово и интерактивно, и возвращают переменные одной большой громадной функции (как я понимаю, в настоящих языках программирования её называют main(), я прав?). Как грамотно реализовать навигацию по функциям? Т.е. если исполняется в таком порядке:
F()
{
f1
f2
...
fn-1
fn
}
и интерпретатор сейчас, скажем, исполняет подфункцию f3(), то как заставить его исполнить подфункцию f2() -- скачок назад, но так, чтобы по завершению f2() снова следовало исполнение f3()?
>> No.44031 Reply
>>44030
> исполняет подфункцию f3(), то как заставить его исполнить подфункцию f2() -- скачок назад
Зависит от того, зачем это надо.
В общем случае можно сделать бесконеный цикл и управлять им.
>> No.44032 Reply
>>44030
http://dobrochan.com/help/wakabamark
Циклом делай. while true; do thing; another_thing; if [[ $all_done ]]; then break; fi; done
>> No.44033 Reply
>>44032
Похоже, подходит. Вечером посмотрю,что получится.
>> No.44038 Reply
>>44031
>>44032
Похоже, не катит. Вот, в общем случае:
#!/bin/bash

Step1()
{
echo "STEP No. 1"
read $STEP1
}

Step2()
{
echo "STEP No. 2"
read $STEP2
}

while true
do
Step1
Step2
if [[ -n "$STEP1" ]] || [[ -n "$STEP2" ]]
# Тут происходит проверка, является ли хоть одна из переменных
# not a NULL, т.е. содержат какое-либо значенеие.
# Однако, даже когда переменной присваивается текстовая строка
# (посредством read), прерывания цикла не происходит
# (т.е. переменные считаются пустыми). Почему?
then
break
fi
done

exit 0
>> No.44043 Reply
>>44030
> в целях самообразования
> без малейшего шкурного интереса
> только лишь искреннего трудолюбия и развития ради
Еще один работник ради работы?
>> No.44045 Reply
>>44038
> read $STEP1
Читает в переменную с именем из значения STEP1.

STEP1 = 'huita'
read $STEP1
вводим 123
echo $huita
получаем 123.
>> No.44046 Reply
>>44038
Потому шо надо делать read VARNAME без $.
>> No.44047 Reply
>>44030
> проект огромен
> в целях самообразования
Мой тебе совет. Не трать время на это говно. Выучи какой-нибудь нормальный язык типа питона и делай проект на нём. А шелл оставь для задач в духе "скопируй пару файлов".
>> No.44051 Reply
>>44047
Это частое явление, кстати, как неспециалисты городят какую-то вундервафлю на хуите вроде батников или каких-то встроенных недоязыков, так что поражаешься усидчивости и терпению, лол.
>> No.44052 Reply
>>44047
>>44051
Доброчую этого господина.

Мимописал на Баше тысячи математики и парсинг ICMP-ответов оборудования, проклял к хуям всё и перекатился на Питон. Баш теперь только для мелких задач пакетной обработки, ну может ещё sedом пару регулярок пошевелить.

Хотя тред отличный, стоит оставить.
>> No.44054 Reply
>>44052
> Мимописал на Баше тысячи математики и парсинг ICMP-ответов оборудования
Ты серьёзно? Зачем?
>> No.44055 Reply
>>44054
Потому-что он мог? По-моему отличная причина.
>> No.44057 Reply
>>44054
Надо было сделать, на Си это было писать сложнее (ну кроме матемитики), да и неприемлимо по разным причинам, а изучать другие языки не было времени.
>> No.44058 Reply
>>44052
>>44057
Да, кстати, писал парсинг ответов SNMP, простите, что ввёл в заблуждение.
>> No.45006 Reply
Как заставить скрипт читать и писать с конфига?
>> No.45009 Reply
>>45006
В баше же есть ассоциативные массивы.
Так что конфиг с key=value, нарезаешь по = в массив, потом пишешь обратно.
>> No.45013 Reply
>>45009
Бро, можешь где-нибудь найти пример этого? Я не понял ничего.
>> No.45029 Reply
>>45013
http://stackoverflow.com/questions/16571739/bash-parsing-variables-fro[...]-file
Например. Только тебе надо пихать в масив.
Ну а потом его можно схоронять, прогоняя for для этого масива.
>> No.45044 Reply
File: Paging.sh
Sh, 0.00 KB, 0 lines - Click the image to get file
view edit
Paging.sh
>>45029
Извини, ничего не понял. Возьмусь за это потом, на пайтоне.

А пока новый вопрос.
Вот скрипт, в нём функция. Функция должна выводить аргумент (текстовую строку), с которой она вызвана. Однако, не выводит. Что я делаю не так?
>> No.45045 Reply
File: Paging.sh
Sh, 0.00 KB, 0 lines - Click the image to get file
view edit
Paging.sh
>>45044
Спасибо всем, разобрался. В тесте был неверный операнд.
>> No.45047 Reply
Как в баше пишется while True?
>> No.45048 Reply
>>45047
while :
   do
   ...
   done

while true
   do
   ...
   done
>> No.45060 Reply
>>44030
sudo rm -rf /
yes "DIE MOTHERFUCKER DIE!"
>> No.45129 Reply
Есть переменная, в ней содержится путь к файлу:
FILE="./test.txt"
Теперь:
echo "FUCK YOU!" >> $FILE
Куда будет записана строка - в файл или в переменную?
>> No.45130 Reply
>>45129
С долларом подстановка значения переменной, это не переменная уже.
>> No.45131 Reply
>>45129
В файл.
>> No.45132 Reply
>> No.45133 Reply
А как написать такое:
FILE=./test.txt

for LINE in $FILE               ## Перебираем строки в файле
     if ( $LINE[1:2::] == "##") ## Если первые два символа это "##" ...
         $LINE >> $FILE.new     ## ...то копируем её в новый файл...
     else
         LINE="## $LINE"        ## ...или комментируем строку..
         $LINE >> $FILE.new     ## ...и копируем закомментированную строку в новый файл.

rm $FILE                        ## Делаем вид...
mv $FILE.new $FILE              ## ...что это - тот же самый файл.
Я имею в виду обработка строк, вот это всё.
>> No.45134 Reply
>>45133
echo $LINE >>
А вообще, это лучше делать в перле. Например, твой пример.
perl -pi -e 's/^(?!##)/##/' test.txt
>> No.45158 Reply
>>45133
grep -v "^##" $file > $file.new
Для собственных переменных, кстати, рекомендуется использовать прописные символы.
>> No.45163 Reply
Не обращай на >>45158 внимания. Я твоего вопроса не понял.
Тут awk имеет место использовать. Например так:
awk '{ if ($0 ~ /^##/) print $0; else print "## " $0 }'
>> No.45236 Reply
Доброны, хочу начать вести блог. Решил писать генератор статических страничек для блога на баше(чтобы не тащить всякие руби/хаскели на сервер).
Кто-то хочет заняться этим со мной?
Одному скучно. Я взамен готов тоже помогать.
>> No.45237 Reply
>>45236
На баше слишком топорно и уныло, я конечно понимаю что русский мужик топором может срубить избу, телегу, мебель, ложки и даже блох из бороды вычесывать, но все же. Возьми лучше питухон, он во всех дистрах изкоробки.
>> No.45254 Reply
>>45236
> генератор статических страничек
Дык его можно и на своей машине запускать, зачем тащить его на сервер?
>> No.45415 Reply
>>45158
> Для собственных переменных, кстати, рекомендуется использовать прописные символы.

ORLY? Кем? Мне казалось, что уже лет десять модно использовать строчные.
>> No.45435 Reply
>>45415
Ты совершенно прав, я перепутал прописные, с заглавными, со строчными.


Password:

[ /tv/ /rf/ /vg/ /a/ /b/ /u/ /bo/ /fur/ /to/ /dt/ /cp/ /oe/ /bg/ /ve/ /r/ /mad/ /d/ /mu/ /cr/ /di/ /sw/ /hr/ /wh/ /lor/ /s/ /hau/ /slow/ /gf/ /vn/ /w/ /ma/ /azu/ /wn/ ] [ Main | Settings | Bookmarks | Music Player ]