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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
urodliv



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Уважаемый FuzzyLogic
Для какой цели у меня эта функция я понимаю. Мне не совсем ясен принцип работы строки
[ -f /var/run/file.pid ] && return 1
Можно ли её расценивать как полный эквивалент следующего выражения:
if [ -f /var/run/file.pid ]; then return 1
И аналогично, в другой функции встречаю похожую конструкцию:
[ -f /var/run/file.pid ] || return 1
Какой существует для неё эквивалент?

Всего записей: 6689 | Зарегистр. 29-04-2009 | Отправлено: 11:31 29-03-2010 | Исправлено: urodliv, 11:32 29-03-2010
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
Извиняюсь, не понял вопроса.
 

Цитата:
 
Можно ли её расценивать как полный эквивалент следующего выражения:
if [ -f /var/run/file.pid ]; then return 1  

Да, можно
 
&& указывает что делать если результат [ ] - правда, а  ||  если ложь
 
т.е. эквивалентом [ -f /var/run/file.pid ] || return 1
будет if [ -f /var/run/file.pid ]; else return 1  

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 19:25 29-03-2010 | Исправлено: FuzzyLogic, 19:25 29-03-2010
urodliv



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FuzzyLogic
Я снова к вам с вопросом. Саму проблему я описывал тут.
Вкратце проблема в следующем. В дистрибутиве debian, ubuntu и др. есть два файлика со стандартными функциями: /lib/lsb/init-functions и /etc/lsb-base-logging.sh Непонятка для меня этих файлов в том, что в них обоих присутствуют функции с одинаковыми именами, но несколько разным кодом. Допустим мне необходимо использовать функцию из первого файла. Я его подключаю в свой скрипт. Но в конце первого файла есть такая строка:
[ -e /etc/lsb-base-logging.sh ] && . /etc/lsb-base-logging.sh || true
которая приводит к подключению второго файла. Путём проведения небольшого опыта с различным подключением файлов подтвердил свою мысль о том, что из двух функций с одинаковыми наименованиями будет использоваться та, которая находится ближе к концу файла.
Теперь вопрос. Существует ли какой-либо способ переопределения использования не "последней" подключённой функции, а "первой"? Я понимаю, что можно просто закомментировать последнюю строку в первом файле, но боюсь нарушить "замысел разработчиков". Ведь зачем-то они придумали именно такую структуру.

----------
Очень скоро еда станет совершенно безвкусной, и тогда этот недостаток придётся компенсировать хорошо развитым воображением.

Всего записей: 6689 | Зарегистр. 29-04-2009 | Отправлено: 22:44 12-04-2010
CHIEFlab

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
есть два файла, в одном имена пользователей, во втором пароли (строка логина в первом файле совпадает со строкой пароля во втором файле) как автоматизировать такую задачу:
необходимо создать пустые файлы, имя которых соответствует логину, и в них записать проль этого пользователя.

Всего записей: 27 | Зарегистр. 04-12-2006 | Отправлено: 12:00 13-04-2010 | Исправлено: CHIEFlab, 12:15 13-04-2010
FuzzyLogic



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

Код:
 
#!/bin/bash
 
FNAMES='names.txt'
FPASSWORDS='passwords.txt'
 
NAMES=( `cat ${FNAMES}` )
PASSWORDS=( `cat ${FPASSWORDS}` )
 
NCOUNT=${#NAMES[@]}
 
for (( i=0; i<${NCOUNT}; i++ )) ; do
  echo "Writing ${PASSWORDS[${i}]} to ${NAMES[${i}]}"
  echo "${PASSWORDS[${i}]}" > ${NAMES[${i}]}
done
 

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 18:50 13-04-2010
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите с написанием скрипта. Надо чтоб на вход подавалось несколько параметров (nfile, spart, npart), затем создавался файл с данными из "nfile", размером равным "spart", содержащий данные вычисляемые по формуле:
fseek(nfile, (размер файла / spart)*npart), SEEK_SET). Где:
nfile - имя файла
spart - размер части
npart - номер части
 
Т.е. если содержимое файла к примеру myfile="12345678910", то скрипт(myfile, 2, 3) создал бы файл с содержимым "56". Баш вижу практически впервые, поэтому очень сложно написать такое. А вам должно быть раз плюнуть.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 14:18 05-05-2010
urodliv



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

#! /bin/bash
#Имя файла скрипта - myscript.sh
 
B=`expr $2 \* \( $3 - 1 \) + 1`
E=`expr $B + $2 - 1`
cut -c $B-$E $1

Вызов скрипта (при правильно заданных разрешениях): myscript.sh nfile spart npart
Замечание: очевидно, что данное решение применимо только к файлам в содержимом которых нет перевода строки, те есть они содержат только одну строку.

----------
Очень скоро еда станет совершенно безвкусной, и тогда этот недостаток придётся компенсировать хорошо развитым воображением.

Всего записей: 6689 | Зарегистр. 29-04-2009 | Отправлено: 18:15 05-05-2010
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хм, мне это надо приспособить для разреза фильмов или rar-архивов (внутри которых опять же видео). А хз что там внутри с переводом строки. Ну и файло сами понимаете крупное, т.е. цель отсекать примерно по 1 Гб. Годится ли это решение для таких целей? И спасибо за отклик.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 19:02 05-05-2010 | Исправлено: Maximus777, 19:05 05-05-2010
urodliv



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

Цитата:
Годится ли это решение для таких целей?

Нифига не годится.

Цитата:
Ну и файло сами понимаете крупное, т.е. цель отсекать примерно по 1 Гб.

Крупность файла не самый страшный параметр
Вы бы задачу в целом описали. А то нарезать-то нарежем, но что потом с нарезкой делать будете?
Пока что могу только указать вам на команду split.  
Подробнее...


----------
Очень скоро еда станет совершенно безвкусной, и тогда этот недостаток придётся компенсировать хорошо развитым воображением.

Всего записей: 6689 | Зарегистр. 29-04-2009 | Отправлено: 20:09 05-05-2010 | Исправлено: urodliv, 20:10 05-05-2010
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо за ответы. Сплит мне не подходит. А задача в принципе простая, есть файл (к примеру 3 Гб), свободное место 1.5 Гб, дык вот надо отрезать сначала 1 Гб с начала файла, слить этот гиг на файлообменник, удалить, затем отрезать следующий гиг, ну и так далее. Решение оказалось гениальным по своей простоте. Спасибо обитателям конференции на jabber.ru. Вот оно:
dd if=file1 of=part2 bs=1048576 count=1024 skip=1024
Эта волшебная строка вырежет из file1 данные, размером 1 Гб, начиная со второго Гб и назовёт это файло part2.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 07:08 06-05-2010
urodliv



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

Цитата:
Сплит мне не подходит

Ухаха! Ну вы меня повеселили. Сам когда-то такой же ерундой с фильмами страдал, и у меня почему-то split без проблем работал.

Цитата:
dd if=file1 of=part2 bs=1048576 count=1024 skip=1024
Эта волшебная строка вырежет из file1 данные, размером 1 Гб, начиная со второго Гб и назовёт это файло part2.

Ага. А чтобы сделать третью часть будем пересчитывать и править "skip"?
split -d -b 1G file file. - эта команда порежет исходный файл на части размером 1 Гб и то что останется, и назовёт их: file.00, file.01 и т.д.
А дальше пуляйте их куда надо...
 
P.S. Если мне память не изменяет, то tar`у сам бог велел бить архивы на части.

----------
Очень скоро еда станет совершенно безвкусной, и тогда этот недостаток придётся компенсировать хорошо развитым воображением.

Всего записей: 6689 | Зарегистр. 29-04-2009 | Отправлено: 16:50 06-05-2010 | Исправлено: urodliv, 17:27 06-05-2010
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
вы невнимательно прочли моё предыдущее сообщение. Сплит мне не подходит не по причине малой функциональности, а в связи с ограниченным свободным местом. Он просто не сможет сложить порезанные части, места не хватит. Поэтому да, править skip и резать. Кстати написать вместо 1024, 2048 совсем не сложно. А поделить на части можно чем угодно, задача состояла в другом - как при делении выхватить только одну часть. Сплит умеет такие фокусы делать? По-моему индейская национальная изба.
 
С dd уже всё проверил, работает как часы. Осталось сделать небольшой скрипт, который будет создавать файл с контрольной суммой и можно всё это хозяйство подсовывать к примеру Тотал коммандеру. Собирает как с добрым утром. Сам пока Krusader'ом собирал, всё гуд. Но надо всё же в консоли научиться это делать. Вот тут может и сплит пригодится, а может и dd это также сделает.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 07:47 07-05-2010 | Исправлено: Maximus777, 07:57 07-05-2010
SAV83



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Если спрашивали, извините, не нашел.
 
в bash есть возможность сложения в командной строке:

Код:
$ $((1+1))
-bash: 2: команда не найдена

а sh меня посылает и  пишет  

Код:
Неверное имя переменной.

Подскажите пожалуйста, как провернуть такое сложение в sh?

Всего записей: 66 | Зарегистр. 17-01-2007 | Отправлено: 09:16 17-05-2010
urodliv



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

----------
Очень скоро еда станет совершенно безвкусной, и тогда этот недостаток придётся компенсировать хорошо развитым воображением.

Всего записей: 6689 | Зарегистр. 29-04-2009 | Отправлено: 19:30 17-05-2010
SAV83



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

Всего записей: 66 | Зарегистр. 17-01-2007 | Отправлено: 09:56 18-05-2010
SPV_Ed



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите. Есть 3 текстовых файла:
 
text1
text2
text3
 
2
3
4
 
7
8
9
 
Как из них можно получить такое:
 
text1;2;9
text2;3;11
text3;4;13
 
3ий столбец - сумма строк из 2 и 3го файлов.
 
Можно ли такое можно сделать в bash и сопутствующих утилитах? Подскажите пожалуйста.  
 
Заранее спасибо за помощь.

Всего записей: 474 | Зарегистр. 20-06-2006 | Отправлено: 22:59 25-06-2010 | Исправлено: SPV_Ed, 23:04 25-06-2010
stsoldier

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите пожалуйста сделать рабочим скрипт. Нужно много файлов переместить из одной папки в подпапку наfreebsd.
 

Код:
#!/bin/bash
mv /folder/2010/033871556823738.png /folder/2010/tech/033871556823738.png
mv /folder/2010/567868250242263.gif /folder/2010/tech/567868250242263.gif
mv /folder/2010/833160657172882.png /folder/2010/tech/833160657172882.png

 
Когда ввожу одну команду руками то все работает, а когда хочу запустить массово
sh /folder/script
 
получаю
No such file or directoryjpg to tech
 
Символы только такие как в примере, цифры и латиница.
директория "tech" - создана
в папке >5,000 картинок, мне нужно только 288 с заранее известными именами (номерами).
"script". "script" - это имя скрипта  
Благодарен за любую помощь
 
_______________________________
РЕШЕНО
Скрипт оказался правильный и рабочий. Проблема была в том, что внося изменения в скрипте на локальной машине, забывал обновлять скрипт на сервере через фтп. Вывод: Будь внимательнее.

Всего записей: 39 | Зарегистр. 27-09-2009 | Отправлено: 19:48 16-09-2010 | Исправлено: stsoldier, 03:19 17-09-2010
Allex_Van_Fogen



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет,
 
Реально ли сделать такое на sh:
Имеем вывод командочки arp -i eth1:

Код:
 
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.1.1            ether   00:10:C6:9F:2C:11   C                     eth1
192.168.1.2            ether   00:10:C6:9F:2C:22   C                     eth1
 

Смотрим файл dnsmasq.leases

Код:
 
1285728383 00:12:17:4e:54:32 192.168.1.230 name1 *
1285717041 00:14:8c:dd:bd:60 192.168.1.191 name2 *
1285725464 00:00:f1:81:12:7a 192.168.1.142 name3 01:00:00:f1:81:12:7a
1285719672 00:10:c6:9f:2c:11 192.168.1.154 name4 01:00:10:c6:9f:2c:11
1285719147 00:19:f4:c0:b1:62 192.168.1.192 name5 *
 

Нужно запускать команду arp -s <IP> 00:00:00:00:00:00 для тех адресов, которые не найдены в файле dnsmasq.leases. Короче говоря нужно прибивать статические айпишники, оставляя только полученные по dhcp.

Всего записей: 92 | Зарегистр. 09-03-2003 | Отправлено: 10:25 30-09-2010
Allex_Van_Fogen



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Оказалось всё примитивно:

Код:
 
#!/bin/sh
# Блокирует хост, если его ip-адрес назначен вручную
 
ARPCACHE=`arp -i eth1 | awk '{ print $1 }' | grep -v ^Address`
 
for TEST_IP in $ARPCACHE;
do
    if [ `grep -c $TEST_IP /var/lib/misc/dnsmasq.leases` == 0 ]; then
        /sbin/arp -s $TEST_IP 00:00:00:00:00:00;
    fi
done
 

Всего записей: 92 | Зарегистр. 09-03-2003 | Отправлено: 11:43 02-10-2010
labrador13

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени суток!
 
Имеется сценарий вида:

Код:
#!/bin/sh -
STR="Hello, $i"
value='test'
i=$value
echo "Now \$i is $i"
echo $STR

 
выполнение даёт результат:

Код:
Now $i is test
Hello,

 
желаемый результат

Код:
Now $i is test
Hello, test

 
т.е. задача - подставить текущее значение $i в $STR, раскрыть её там, и только после этого передать всё вместе аргументом echo(), как было бы, если привести сценарий к виду

Код:
#!/bin/sh -
value='test'
i=$value
echo "Now \$i is $i"
STR="Hello, $i"
echo $STR

 
выполнение которого даёт

Код:
Now $i is test
Hello, test

 
Эни хэлп?

Всего записей: 1 | Зарегистр. 06-10-2010 | Отправлено: 17:41 06-10-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