BASH Scripting

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

lexxus
Сообщения: 27
ОС: Linux Ubuntu

Re: BASH Scripting

Сообщение lexxus »

Эх, что-т не хочет работать
+ "Connect dsl-provider" Exec sudo pon dsl-provider

И после этого глухо как в танке, интернет не включается :(

Но, спасибо за скрипт :) Знать бы еще что там переделать... в скриптах не силен, увы :(
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: BASH Scripting

Сообщение watashiwa_daredeska »

lexxus писал(а):
10.10.2008 13:28
Эх, что-т не хочет работать
+ "Connect dsl-provider" Exec sudo pon dsl-provider

И после этого глухо как в танке, интернет не включается :(

Естественно. Я ж написал, что скрипт генерит меню для FVWM, а не включает/выключает.


lexxus писал(а):
10.10.2008 13:28
Но, спасибо за скрипт :) Знать бы еще что там переделать... в скриптах не силен, увы :(

Ну, можно где-то примерно так (НЕПРОТЕСТИРОВАНО!):

Код: Выделить всё

#!/bin/sh

provider="dsl-provider"
if ps -o cmd ax |egrep '^(/usr/sbin/)?pppd call' >/dev/null 2>&1; then
  poff $provider
else
  pon $provider
fi
Спасибо сказали:
lexxus
Сообщения: 27
ОС: Linux Ubuntu

Re: BASH Scripting

Сообщение lexxus »

Огромное спасибо, работает :)
Спасибо сказали:
tremor
Сообщения: 32

Re: BASH Scripting

Сообщение tremor »

а у меня такой вопрос: цикл for читает в переменной не строки а слова, а мне надо строки как сделать? вот пример чтоб ясно было

ls /mnt/vint > /tmp/list
for i in $(grep ^ /tmp/list.txt)
ln $i /mnt/tmp/$1
done

дак вот если в имени папки будет пробел, то сосчитается не вся папка в переменную i а только ее часть до пробела. Перепробовал всякие заключения в {} и в "" - не помогает. как быть?
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: BASH Scripting

Сообщение Portnov »

ls /mnt/vint | grep ... | while read i
do ln $i /mnt/tmp/$1
done
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
tremor
Сообщения: 32

Re: BASH Scripting

Сообщение tremor »

да, Portnov, спасибо, с while работает как надо. правда при создании ссылок надо переменную i брать в кавычки все таки, но это мелочи.
Спасибо сказали:
tremor
Сообщения: 32

Re: BASH Scripting

Сообщение tremor »

Всем привет. Еще такая задача на работе, поменять в 5-и филиалах (удаленно и, хочется, автоматически) параметры ярлыка на запуск терминала с 1ской (строчку Exec = rdesktop ....... ). дак вот наваял скрипт (while сдесь еще больше пригодился))). Самая главная строчка скрипта :

sed '/rdesktop/cExec=rdesktop -u $user -d ingri -k common -m -z -a 16 -x m -N -P 192.168.101.10' $path/$user/Desktop/$i > /tmp/obraz # тут идет сама замена
cat /tmp/obraz > $path/$user/Desktop/$yarlyk # это посути перепись старого ярлыка новым

Дак вот $user так и вставляется как $user а не как filimonov или panteleev. подскажите как быть...
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: BASH Scripting

Сообщение watashiwa_daredeska »

tremor писал(а):
27.10.2008 14:46
sed '/rdesktop/cExec=rdesktop -u $user -d ingri -k common -m -z -a 16 -x m -N -P 192.168.101.10' $path/$user/Desktop/$i > /tmp/obraz # тут идет сама замена

Код: Выделить всё

sed "/rdesktop/cExec=rdesktop -u $user -d ingri -k common -m -z -a 16 -x m -N -P 192.168.101.10" $path/$user/Desktop/$i > /tmp/obraz
Спасибо сказали:
tremor
Сообщения: 32

Re: BASH Scripting

Сообщение tremor »

Да, в кавычках "" работает, но в книге про SED сказано что синтаксис именно: sed 'параметры', а не sed "параметры" - эсли бы не вы - не догадался бы низачто )) Вобщем поменял всем ярлыки за пару сек...
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: BASH Scripting

Сообщение watashiwa_daredeska »

tremor писал(а):
28.10.2008 07:21
в книге про SED сказано что синтаксис именно: sed 'параметры', а не sed "параметры"

Эти кавычки относятся к bash, а не к sed.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: BASH Scripting

Сообщение Folderx »

цикл for читает в переменной не строки а слова, а мне надо строки как сделать?


Код: Выделить всё

#!/bin/sh

( # чтобы сохранить IFS для остального скрипта
    IFS=$'\n';
    for LINE in $(cat file.txt); do
        echo "$LINE";
    done;
)

echo -n "$IFS" | cat -vet;    # переменная сохранилась

exit 0;


file.txt

Код: Выделить всё

abcd
e f g
h  i  j  k
l   m   n   .


вывод

Код: Выделить всё

[guest@localhost tmp]$ ./test.sh
abcd
e f g
h  i  j  k
l   m   n   .
 ^I$ # здесь пробел перед ^ есть
[guest@localhost tmp]$



можно выполнять и без субшела (круглые скобки), т.е. не восстанавливать разделитель или восстановить вручную

Код: Выделить всё

IFS=$' \t\n';


деление по любому символу
Спасибо сказали:
Аватара пользователя
landgraf
Сообщения: 2142
Статус: *бунту ненавистник
ОС: linux

Re: BASH Scripting

Сообщение landgraf »

изучаю понемногу ABS
Удаление части строки
${string#substring} - до первого с начала

сделал такой минискрипт

Код:

#!/bin/bash stringZ='Купипа мама коника' substringZ='к' echo ${stringZ#$substringZ}

не работает (выдает такую же строчку)
зато замена

Код:

#!/bin/bash stringZ='Купипа мама коника' substringZ='к' substringY='н' echo ${stringZ//$substringZ/$substringY}

работает...
где ошибка?
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4458
Статус: GNU generation
ОС: Debian GNU/Linux

Re: BASH Scripting

Сообщение Rootlexx »

landgraf
Удаление подстроки выражением вида:

Код: Выделить всё

${string#substring}
— выполняется с начала этой строки. То есть в substring должен находиться шаблон, подходящий началу строки. Разница между использованием # и ## заключается в выборе наименьшей или наибольшей подстроки соответственно. Проиллюстрирую это:

Код: Выделить всё

[rootlexx@localhost ~]$ string="Купила мама коника"
[rootlexx@localhost ~]$ substring="к"
[rootlexx@localhost ~]$ printf "%s\n" "${string#$substring}" # Не соответствует началу строки
Купила мама коника
[rootlexx@localhost ~]$ printf "%s\n" "${string#*$substring}" # А теперь соответсвует, ибо добавлен символ «*»
оника
[rootlexx@localhost ~]$ substring="*к"
[rootlexx@localhost ~]$ printf "%s\n" "${string#$substring}" # Точно так же можно добавить этот символ в само выражение подстроки
оника
[rootlexx@localhost ~]$ printf "%s\n" "${string##$substring}" # А теперь удалена самая длинная подстрока
а
[rootlexx@localhost ~]$
Спасибо сказали:
Аватара пользователя
landgraf
Сообщения: 2142
Статус: *бунту ненавистник
ОС: linux

Re: BASH Scripting

Сообщение landgraf »

Rootlexx
спасибо, теперь понятно...
еще один вопрос возник
имею переменную a со значением b, переменную c со значением d
как создать переменную b со значеним d?
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4458
Статус: GNU generation
ОС: Debian GNU/Linux

Re: BASH Scripting

Сообщение Rootlexx »

landgraf писал(а):
15.11.2008 12:05
имею переменную a со значением b, переменную c со значением d
как создать переменную b со значеним d?

Немного не понял. Это вы про косвенные ссылки на переменные, что ли?

Код: Выделить всё

[rootlexx@localhost ~]$ a=b
[rootlexx@localhost ~]$ b=c
[rootlexx@localhost ~]$ printf "%s\n" "$a"
b
[rootlexx@localhost ~]$ printf "%s\n" "${!a}"
c
[rootlexx@localhost ~]$
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4458
Статус: GNU generation
ОС: Debian GNU/Linux

Re: BASH Scripting

Сообщение Rootlexx »

Можно хоть такое устроить: значение переменной a равно "b", значение переменной c равно "d", а значение переменной d равно "e". Можно присвоить переменной, имя которой хранится в a, значение переменной, имя которой хранится в c:

Код: Выделить всё

[rootlexx@localhost ~]$ a="b"
[rootlexx@localhost ~]$ c="d"
[rootlexx@localhost ~]$ d="e"
[rootlexx@localhost ~]$ declare $a="${!c}"
[rootlexx@localhost ~]$ printf "%s = \"%s\"\n" "$a" "${!a}"
b = "e"
[rootlexx@localhost ~]$

Ну и любой уровень вложенности можно устроить, но только с использованием временных переменных.
Спасибо сказали:
Аватара пользователя
landgraf
Сообщения: 2142
Статус: *бунту ненавистник
ОС: linux

Re: BASH Scripting

Сообщение landgraf »

Rootlexx
не совсем, вроде.

приведу пример:
у меня есть строчка вида '<variable>value</variable>' - то есть XML
я вытащил из нее
$var1="variable"
$var2="value"
можно ли мне сделать так, чтобы было соответствие $variable=value?
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: BASH Scripting

Сообщение Portnov »

landgraf

Код: Выделить всё

declare $var1=$var2
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
landgraf
Сообщения: 2142
Статус: *бунту ненавистник
ОС: linux

Re: BASH Scripting

Сообщение landgraf »

Portnov
спасибо :yes3:
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4458
Статус: GNU generation
ОС: Debian GNU/Linux

Re: BASH Scripting

Сообщение Rootlexx »

landgraf писал(а):
16.11.2008 09:34
Rootlexx
не совсем, вроде.

приведу пример:
у меня есть строчка вида '<variable>value</variable>' - то есть XML
я вытащил из нее
$var1="variable"
$var2="value"
можно ли мне сделать так, чтобы было соответствие $variable=value?

Хм. Это я и написал, только немного сложнее:
Rootlexx писал(а):
15.11.2008 13:47
[rootlexx@localhost ~]$ declare $a="${!c}"

Единственное отличие состоит в том, что у меня переменной, имя которой хранится в a, присваивается не просто значение переменной c, а значение переменной, имя которой хранится в c, но, думаю, абсолютно несложно понять, как сделать в вашем случае на основе написанного.

Меня ввела в некоторое раздумье ваша фраза:
landgraf писал(а):
15.11.2008 12:05
как создать переменную b со значеним d?

— в b должно храниться значение "d" или значение переменной d? Собственно, потому я решил написать вариант посложнее, ибо тот, что проще, легко получить из сложного.
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: BASH Scripting

Сообщение ZyX »

Обнаружил в zsh такую полезную штуку при работе с eval, как флаг экранирования
спецсимволов. Кто-нибудь знает, как сделать такое в [bа]sh?

Код: Выделить всё

(zyx:~) % STRING="t'\"t i\ni"
(zyx:~) % touch ${STRING}
(zyx:~) % stat -c "%n" $STRING
t'"t i\ni
(zyx:~) % eval "stat -c \"%n\" ${STRING}"
zsh: unmatched '
(zyx:~) % eval "stat -c \"%n\" ${(q)STRING}"
t'"t i\ni
(zyx:~) % bash -c "stat -c \"%n\" \${STRING}; stat -c \"%n\" \"\${STRING}\"; eval \"stat -c \\\"%n\\\" \\\"\${STRING}\\\"\"; eval \"stat -c \\\"%n\\\" '\${STRING}'\"; eval \"stat -c \\\"%n\\\" \${STRING}\""
stat: невозможно выполнить stat для `t\'"t': Нет такого файла или каталога
stat: невозможно выполнить stat для `i\\ni': Нет такого файла или каталога
t'"t i\ni
bash: eval: line 0: unexpected EOF while looking for matching `"'
bash: eval: line 1: ошибка синтаксиса: неожиданный конец файла
bash: eval: line 0: unexpected EOF while looking for matching `"'
bash: eval: line 1: ошибка синтаксиса: неожиданный конец файла
bash: eval: line 0: unexpected EOF while looking for matching `''
bash: eval: line 1: ошибка синтаксиса: неожиданный конец файла

Или только извращаться через sed?

Код: Выделить всё

(zyx:~) % bash -c "STRING=\$(echo \"\${STRING}\" | sed -e \"s/\\\\\\\\\\\\|\\\"\\\\|'\\\\|\\\\s/\\\\\\\\\\\\0/g\"); eval \"stat -c \\\"%n\\\" \\\"\${STRING}\\\"\"; eval \"stat -c \\\"%n\\\" '\${STRING}'\"; eval \"stat -c \\\"%n\\\" \${STRING}\""
stat: невозможно выполнить stat для `t\\\'"t\\ i\\ni': Нет такого файла или каталога
bash: eval: line 0: unexpected EOF while looking for matching `''
bash: eval: line 1: ошибка синтаксиса: неожиданный конец файла
t'"t i\ni
Спасибо сказали:
blackbumer
Сообщения: 11
ОС: Suse Gentoo Ubuntu

Re: BASH Scripting

Сообщение blackbumer »

Уважаемые гуру подскажите как реализовать это:
на входе есть текстовый файл в кодировке UTF8 содержащий русский текст но набранный какбы на латинской раскладке, т.е следующем виде(содержание):

Код: Выделить всё

ghbdtn lheu


означает
привет друг
ghbdtn lheu

как его перекодировать в читаемый вид?

пробовал так:

Код: Выделить всё

#!/bin/sh
eng="qwe"
rus="йцу"
cat logxx.txt | tr $eng $rus > resultlog.txt

ну не прокатило на выходе кракозябры


Уважаемые гуру подскажите как реализовать это:
на входе есть текстовый файл в кодировке UTF8 содержащий русский текст но набранный какбы на латинской раскладке, т.е следующем виде(содержание):

Код: Выделить всё

ghbdtn lheu


означает
привет друг
ghbdtn lheu

как его перекодировать в читаемый вид?

пробовал так:

Код: Выделить всё

#!/bin/sh
eng="qwe"
rus="йцу"
cat logxx.txt | tr $eng $rus > resultlog.txt

ну не прокатило на выходе кракозябры
Спасибо сказали:
Аватара пользователя
greak
Сообщения: 485
Статус: debian user
ОС: Debian Lenny/Sid

Re: BASH Scripting

Сообщение greak »

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys, os
dict={'q':'й','w':'ц','e':'у','r':'к','t':'е','y':'н','u':'г','i':'ш','o':'щ','p':'з','[':'х',']':'ъ','a':'ф','s':'ы','d':'в','f':'а','g':'п','h':'р','j':'о','k':'л','l':'д',';':'ж','\'':'э','z':'я','x':'ч','c':'с','v':'м','b':'и','n':'т','m':'ь',',':'б','.':'ю','/':'.',' ':' ','Q':'Й','W':'Ц','E':'У','R':'К','T':'Е','Y':'Н','U':'Г','I':'Ш','O':'Щ','P':'З','A':'Ф','S':'Ы','D':'В','F':'А','G':'П','H':'Р','J':'О','K':'Л','L':'Д','Z':'Я','X':'Ч','C':'С','V':'М','B':'И','N':'Т','M':'Ь','?':',','<':'Б','>':'Ю','{':'Х','}':'Ъ','&':'?','$':'4','^':':',')':')','(':'(','*':'*'}

s=raw_input("введите текст: ")
h=len(s)
print s
for i in range(1,(h+1)):
print "\b"+dict[s[(i-1)]],

Вот на питоне. Мапед не мой, но работает.
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: BASH Scripting

Сообщение ZyX »

blackbumer писал(а):
10.01.2009 14:23
Уважаемые гуру подскажите как реализовать это:
на входе есть текстовый файл в кодировке UTF8 содержащий русский текст но набранный какбы на латинской раскладке, т.е следующем виде(содержание):

Код: Выделить всё

ghbdtn lheu


означает
привет друг
ghbdtn lheu

как его перекодировать в читаемый вид?

пробовал так:

Код: Выделить всё

#!/bin/sh
eng="qwe"
rus="йцу"
cat logxx.txt | tr $eng $rus > resultlog.txt

ну не прокатило на выходе кракозябры


Уважаемые гуру подскажите как реализовать это:
на входе есть текстовый файл в кодировке UTF8 содержащий русский текст но набранный какбы на латинской раскладке, т.е следующем виде(содержание):

Код: Выделить всё

ghbdtn lheu


означает
привет друг
ghbdtn lheu

как его перекодировать в читаемый вид?

пробовал так:

Код: Выделить всё

#!/bin/sh
eng="qwe"
rus="йцу"
cat logxx.txt | tr $eng $rus > resultlog.txt

ну не прокатило на выходе кракозябры

Код: Выделить всё

(zyx:~) % echo eotnhaunteo | perl -e "use utf8;while(<>){\$_=~tr/qwertyuiop[]asdfghjkl;'zxcvbnm/йцукенгшщзхъфывапролджэячсмитьбю./;print(\$_);}"
Wide character in print at -e line 1, <> line 1.
ущетрфгтеущ

Ругается немного, но работает. Ругается, разумеется, в stderr. И эта жуть на
питоне не нужна.

Другой вариант — использовать однобайтовые кодировки:

Код: Выделить всё

(zyx:~) % cat ./test.sh | iconv -f CP1251
#!/bin/sh
USkmap="qwertyuiop[]asdfghjkl;'zxcvbnm"
RUkmap="йцукенгшщзхъфывапролджэячсмитьбю."
tr $USkmap $RUkmap
# vim: fenc=cp1251
(zyx:~) % echo eotnhaunteo | ./test.sh | iconv -f CP1251
ущетрфгтеущ
Спасибо сказали:
H1ghlander
Сообщения: 8

Re: BASH Scripting

Сообщение H1ghlander »

пишу один скриптик. застрял на том, что никак не могу сообразить, как сделать можно было бы работать с выводом какой-нибудь программы.
Допустим есть программа acpi, (выводит информацию о батареи) мне нужно взять то что она вывела и с помощью cut забрать только один параметр, как это сделать?
Есть мысль, что можно занести в файл, то что он показала, а от туда уже забрать, то что нужно, но это как-то громоздко получается, я уверен, что все это можно сделать намного проще, но я никак не могу сообразить.
help me!
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: BASH Scripting

Сообщение diesel »

H1ghlander писал(а):
10.01.2009 23:26
пишу один скриптик. застрял на том, что никак не могу сообразить, как сделать можно было бы работать с выводом какой-нибудь программы.
Допустим есть программа acpi, (выводит информацию о батареи) мне нужно взять то что она вывела и с помощью cut забрать только один параметр, как это сделать?
Есть мысль, что можно занести в файл, то что он показала, а от туда уже забрать, то что нужно, но это как-то громоздко получается, я уверен, что все это можно сделать намного проще, но я никак не могу сообразить.
help me!

прочитай статью на которую дана ссылка в первом посте. внимательно.
Спасибо сказали:
H1ghlander
Сообщения: 8

Re: BASH Scripting

Сообщение H1ghlander »

diesel
спасибо.

Теперь у меня другой вопрос, можно ли сделать в баше, так чтобы брался вывод какой-либо программы заносился в переменную или например в файл и эти результаты обновлялись через определеный период времени, (который я установлю) а потом эти результаты бы выводились из этого файла или переменой на экран.
есть предположение что это можно через бесконечный цикл осуществить, но как и как можно расчитать время обновления данных?
:wacko:
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: BASH Scripting

Сообщение SLEDopit »

H1ghlander писал(а):
12.01.2009 18:08
Теперь у меня другой вопрос, можно ли сделать в баше, так чтобы брался вывод какой-либо программы заносился в переменную или например в файл и эти результаты обновлялись через определеный период времени, (который я установлю) а потом эти результаты бы выводились из этого файла или переменой на экран.
есть предположение что это можно через бесконечный цикл осуществить, но как и как можно расчитать время обновления данных?
:wacko:
может стоит посмотреть в сторону консольной программки watch ?
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
H1ghlander
Сообщения: 8

Re: BASH Scripting

Сообщение H1ghlander »

а эту программу обязательно надо запускать в fullscreen?
мне просто надо с вывода acpi забрать забрать отдельные значения с помощью cut, я в скрипте написал:
wat=$(watch -t acpi)
mt=`echo $wat | cut -d' ' -f5 | cut -d':' -f3 | cut -d',' -f3`
ch=`echo $wat | cut -d' ' -f5 | cut -d':' -f2 | cut -d',' -f3`
vse=$((( $ch * 60 ) + $mt ))
echo $vse
(это часть скрипта)
но с этими строчками скрипт не запускается.
что не так?
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: BASH Scripting

Сообщение diesel »

H1ghlander писал(а):
12.01.2009 18:08
diesel
спасибо.

Теперь у меня другой вопрос, можно ли сделать в баше, так чтобы брался вывод какой-либо программы заносился в переменную или например в файл и эти результаты обновлялись через определеный период времени, (который я установлю) а потом эти результаты бы выводились из этого файла или переменой на экран.
есть предположение что это можно через бесконечный цикл осуществить, но как и как можно расчитать время обновления данных?
:wacko:

время обновления данных у тебя же есть? или как?

while 1; do
<----обновляем данные, деллаем что-то ------>

sleep 2

done
Спасибо сказали: