Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Shell scripts (sh, bash, zsh, tcsh)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8

Открыть новую тему     Написать ответ в эту тему

alyent



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обратите, пожалуйста, внимание, что существует более активная на настоящий момент смежная ветка.

Там же можно ознакомится со списком примечательной литературы по теме.
Первый пост этой ветки имел вид...

Всего записей: 1087 | Зарегистр. 09-03-2002 | Отправлено: 10:04 02-02-2003 | Исправлено: ASE_DAG, 19:08 12-07-2013
ivanmara



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ подскажите как получить имя файла без слешей в скрипте.  допустим файл запускается из /usr/bin/ctest ... тогда переменная $0 получит значение /usr/bin/ctest а мне нужно получить именно имя файла без пути ... то есть просто ctest как бы сделать ?  
 
Добавлено:
Разобрался. Пару вариантов(предполагаеться что нет аргументов коммандной строки после пути к файлу):  
1. используем unix комманду basename  
filename=`basename "$path_with_arg"`
echo $filename;
 
2. средствами самого bash:
filename=${path_with_arg##*/}
echo $filename;
 
смысл выражения ##:  
${string##substring}
    Удаление самой длинной, из найденых, подстроки $substring в строке $string. Поиск ведется с начала строки
где */ - любая последовательность символов включая /
 
Правильно обрабатывает случаи:
/usr/bin/test
./test

Всего записей: 515 | Зарегистр. 23-06-2006 | Отправлено: 19:27 23-07-2008
glebsts

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день,
подскажите пожалуйста, как набор строк - результат обработки файла sed-ами  и grepами - перевести в shell массив (declare -a ..)? Массив большой, поэтому перформанс критичен..
Спасибо.

Всего записей: 6 | Зарегистр. 01-05-2007 | Отправлено: 11:19 18-11-2008
glebsts

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Мде, как-то здесь тихо.  
Еще вопрос возник: создаю строковую переменную, которую потом хочу использовать как паттерн для грепа.
p1="a|b"
str="abc"
 
echo `echo ${str} | grep -E '${pl}'`
Есть мнение, что символ | как-то не по замыслу начинает использоваться.
Подскажите, как правильно сделать?

Всего записей: 6 | Зарегистр. 01-05-2007 | Отправлено: 01:44 03-12-2008
f_serg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
glebsts

Цитата:
Подскажите, как правильно сделать?

 

Код:
$ p1="a|b"
$ str="abc"
$ echo ${str} | grep -E "${pl}"
abc
$

 
Добавлено:
Так, стоп.
p1 и pl - разные переменные!
 
Добавлено:
Но все равно надо брать в двойные кавычки.

----------
Serg

Всего записей: 1706 | Зарегистр. 11-09-2002 | Отправлено: 09:26 05-12-2008
Serhi_84

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте.
 
Есть 2 сервера - локальный и удаленный (юниксовые). Необходимо сделать синхронизацию одной папки с подпапками. Собрал rsync, планируется, что данные будут передаваться с удаленной машины на локальную, то есть по идее rsync должен валяться на локальной машине. Накидал простенькую строчку:
 
rsync -aqz -e "ssh -pXXX" user@server:/remore_dir/ /local_dir/
 
запускаю - пишет ошибку. Пробую с параметром -vv - пишет не может найти rsync (хотя в скрипте путь был полностью прописан). Хорошо, кидаю файл в /usr/bin - все-равно такое же. Решил проверить на всякий случай, кинул rsync на удаленный сервак - скрипт заработал! Теперь первый вопрос - почему при такой передаче необходимо чтобы rsync находился на удаленной машине? По идее есть 2 варианта - либо rsync на удаленной - демон, либо он хранится на локальной машине. На удаленке демон мне не нужен. Неужели он должен валяться на обеих машинах?
 
Далее, при запуске скрипта у меня появляется строка для ввода пароля, пароль вввожу ручками, все синхронизируется. Вопрос второй - как в строчке скриптовой прописать пароль? Пробовал по-всякому:
 
rsync -aqz -e "ssh -pXXX" user:pass@server:/remore_dir/ /local_dir/ - не работает
 
rsync -aqz -e "ssh -pXXX" user@server:/remore_dir/ /local_dir/ < pass - не работает
 
Можно использовать конечно параметр файла с паролем, но данный случай мне не подходит, так как здесь требуется rsync daemon.
 
Понимаю, что можно сделать все через ключи и делается это просто, но требуется реализация процедуры, описанной выше (если это вообще возможно сделать)
 
Заранее спасибо

Всего записей: 30 | Зарегистр. 29-02-2008 | Отправлено: 01:43 08-12-2008
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В общем, решил настроить регулярный бекап по расписанию удаленной бд средствами mysql, так как заметил, что сторонние программы очень ненадежны - то там то тут ошибки...
Задача такая:
Находясь во freebsd - локальной машине, необходимо подключиться по ssh, соединиться с хостом удаленной базы - бд и сайт на разных хостах - после чего выполнить mysqldump и затем полученный дамп скопировать себе в папку. Нужно, чтобы все это дело последовательно обрабатывалось простым скриптом и было записано в крон - в принципе, все основное таким именно простейшим в одну строчку скриптом сделал, вышло где то так:

Цитата:
#!/bin/sh
 
BACKUPFILE=/home/user/dumps/db_`date +%H:%M_%d%m%y`.sql.gz
 
ssh user@mysite.com 'mysqldump -u dbuser -ppassword db_mydb -h dbhost | gzip' > ${BACKUPFILE}

 
Ну вот, в принципе, прописал в кроне и все работает. Имена специально хочу делать с датой и временем, и вот почему.
Единственное, что не могу понять. Надо, чтобы этих дампов не собиралось там очень уж много.Ну скажем, я делаю бекап регулярно, каждый час. Нафига мне там 24 штуки в сутки чтобы хранились и копились? Надо добавить, чтобы скрипт выполнял проверку на число файлов в директории, и если их там больше скажем 3-х, все старые удалял, оставляя только 3 последних, по времени создания или по именам файлов,в которых как раз продублировано время создания.
если кто подскажет, буду признателен.
ps:
вот щас думал, думал, получается такая штука.
каждый новый дамп будет не больше и не меньше, а только и всегда червертым, если я хочу оставлять скажем три файла, то мне надо удалять всегда один - старейший, ну, или, по логике, имеющий наименьший размер..

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 23:38 24-06-2009
5trovi4



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
А никто не подскажет, чем отличаются  такие  вызова  второго скрипта из первого?
 
. 2.sh
 
2.sh
 
exec 2.sh
 
Я раньше думал что знаю, но , как оказалось ,  на практике как-то не выходит так как я думал.

Всего записей: 69 | Зарегистр. 16-11-2006 | Отправлено: 13:37 03-09-2009
vjunk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
. 2.sh

Будет вызван второй скрипт в контексте текущего интерпретатора, как если-бы его текст был вставлен в это место первого скрипта, второму скрипту доступны все переменные и функции из первого и наоборот.

Цитата:
2.sh

Будет запущен новый процесс с новой копией интерпретатора, после его завершения продолжится выполнение первого скрипта, любые изменения в окружении сделанные во втором скрипте будут потеряны.

Цитата:
exec 2.sh

Будет запущен новый процесс, который заместит собой текущий. Операторы, стоящие после этой строки могут быть выполнены, только если запуск нового процесса не удастся (например, не найден файл второго скрипта).

Всего записей: 303 | Зарегистр. 23-02-2005 | Отправлено: 20:54 09-09-2009
Dukat



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите решить задачку:

Цитата:
Shell-программа подсчитывает количество и выводит список всех файлов (без каталогов) в алфавитном порядке в поддереве, начиная с каталога, имя которого задано параметром Shell-программы. Проверять, что параметр - имя доступного каталога. Форма вывода результата:
каталог <имя каталога>            - начальный каталог
     <имя файла>                       - файлы в каталоге
     <имя файла>
     ....
каталог <имя каталога>            - подкаталог
     <имя файла>
     <имя файла>
     ....
и т.д.


Всего записей: 1412 | Зарегистр. 01-10-2006 | Отправлено: 09:20 14-10-2009
strden

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
#!/bin/bash
 
dfm="df -m /xxx | awk '{print $3}' |tail -1"   # получить объем свободного места в папке
 
echo Free = `$dfm` Mb
 
что то накопировал наудалял
 
rm /xxx/porno.avi
 
echo After delete Free = `$dfm` Mb
 
Подскажите плиз как в параметры правильно заносить составные команды?
Если я буду использовать одинарные апостровы в dfm=`df -m /xxx | awk '{print $3}' |tail -1` то параметру dfm присвоется число свободных Мю в самом начале выполнения скрипта и потом меняться не будет! А мне надо получать в скрипте каждый раз при обращении к $dfm актуальный размер свободного пространства.
Это возможно?

Всего записей: 4 | Зарегистр. 01-03-2008 | Отправлено: 11:39 19-10-2009
strden

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот (надеюсь) правильно поставленный вопрос...
Ось Юникс
 
Как в баш скрипте в переменную занести команду а не значение полученное в результате выполнения этой команды. Дабы потом при каждом вызове этой переменной получать АКТУАЛЬНОе значение (результат выполнения этой команды). Что пытаюсь запомнить в переменную : dfm=$(df -k /tmp | awk '{print $3}' |tail -1)
 
 
Надо чтобы при каждом вызове переменной $dfm получать актуальный размер папки ТМП в баш скрипте

Всего записей: 4 | Зарегистр. 01-03-2008 | Отправлено: 10:18 20-10-2009
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 Надо чтобы при каждом вызове переменной $dfm получать актуальный размер папки ТМП в баш скрипте

Переменную нельзя вызывать ... в переменных может что-то храниться.
 
А вызвать содержание того что лежит в переменной точно также как вы делаете, только + eval
 

Код:
 
dfm="df -k /tmp | awk '{print \$3}' |tail -1"
eval $dfm
 

 
ну или пишите функции, их можно вызывать.

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 21:19 20-10-2009 | Исправлено: FuzzyLogic, 21:59 20-10-2009
Tipulatoid



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуйста. Пытаюсь создать массив
Скрипт new

Код:
 
#!/bin/sh
echo test
a[1]=hjhj
a[2]=jjkjk
echo ${a[1]}
 

выдает  

Код:
test
./new: 3: a[1]=hjhj: not found
./new: 4: a[2]=jjkjk: not found
./new: 5: Bad substitution
 

Те же самые команды, копи-пастнутые в консоль, нормально отрабатывают. Где затык?
Ubuntu 9.04

Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 08:43 28-10-2009 | Исправлено: Tipulatoid, 08:44 28-10-2009
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Tipulatoid
Поменяйте

Цитата:
#!/bin/sh

на  

Код:
 
#!/bin/bash
 

и будет вам счастье. Ну и заодно посмотрите на что указывает ссылка /bin/sh, изначально в убунте это что-то левое, не то ksh не то что-то ещё.

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 18:25 28-10-2009
Tipulatoid



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FuzzyLogic
Спасибо )

Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 02:24 29-10-2009
strden

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FuzzyLogic
СПАСИБО!
Ваше решение работает!
Нашел еще одно...
Сейчас на вскидку не вспомню.. идея - в переменную занести строку... а потом использовать ее как команду...
ЕЩЕ РАЗ СПАСИБО!

Всего записей: 4 | Зарегистр. 01-03-2008 | Отправлено: 14:50 02-11-2009
Dukat



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
del

Всего записей: 1412 | Зарегистр. 01-10-2006 | Отправлено: 17:54 08-12-2009 | Исправлено: Dukat, 12:48 09-12-2009
Timuridze1

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Проверяет заведомо рабочий сайт, если тот не работает то голосом объявляет о отстутствии подключения к интернет. Но требуеться его доработать, как сделать так что бы после того как он 1 раз объявит что сеть упла он больше не надоедал свомими оповещениями, а после того как инет заработал объявлял о наличии сети и опять успокаивался?
Bcgjkmpetnmcz festival, это голосовой движок под nix, качество отстает от виндовых аналогов но мне хватает.
 
#!/bin/bash
 
ip="ya.ru"
count=3
attempt=3
file="./time"
 
result=$(ping -c ${count} ${ip} | tail -2 | head -1 | awk '{print $4}')
if [ $result -eq 0 ]; then
if [ -f ${file} ]; then
f=$(cat ${file})
if [ ${f} -eq ${attempt} ]; then
rm ${file}
echo "Соединение с интернет отсутствует" | festival --tts
else
att=$(expr ${f} + 1)
fi
else
att=1
fi
 
if [ ! -z ${att} ]; then
echo ${att} > ${file}
fi
else
if [ -f ${file} ]; then
rm ${file}
fi
fi

Всего записей: 81 | Зарегистр. 08-09-2008 | Отправлено: 01:39 13-01-2010
urodliv



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Граждане.
Со скриптами до сего момента работал на самом примитивном уровне (cat/cut). А тут разбираю чужой стартовый скрипт и натыкаюсь на след. конструкцию.
running () {
.....................
[ -f /var/run/file.pid ] && return 1
.....................
}

Вроде все компоненты кода ясны, а смысл в целом понять не могу. Прошу разъяснить, как работает эта конструкция.

Всего записей: 6684 | Зарегистр. 29-04-2009 | Отправлено: 23:21 28-03-2010
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
 
Ф-я running если есть файл /var/run/file.pid то возвращает единицу. Т.е. просто проверяет запущен ли какой-то сервис или что-нибудь ещё (хз что такое file.pid  )
Часто используемый способ для чего-то что стартует например по расписанию скажем каждые 5 минут чтобы подстраховаться от ситуации в которой программа не успевает сделать всё за те самые пять минут, и чтобы не запускать вторую копию скрипта мы вначале работы создаём пресловутый файл а конце его удаляем (т.е. наличие файла означает что копия скрипта уже работает).

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 04:15 29-03-2010 | Исправлено: FuzzyLogic, 08:54 29-03-2010
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Shell scripts (sh, bash, zsh, tcsh)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru