bash, несколько вопросов

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

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

Аватара пользователя
Zeus
Сообщения: 694

Re: bash, несколько вопросов

Сообщение Zeus »

У меня тогда тоже вопрос про bash:
есть у меня переменная
CHANNEL=08
А как из неё сделать другую переменную
CH=8
?
Т.е. как убрать ведущи(й,е) ноль?
Пробовал
let CH=$CHANNEL
но оно видимо считает, что ведущий ноль - это признак восмеричного числа и ругается на встречающиеся цифры > 7
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: bash, несколько вопросов

Сообщение diesel »

А вот так?

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

channel=08; ch=${channel##0}; echo $ch
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: bash, несколько вопросов

Сообщение Zeus »

diesel писал(а):
29.08.2006 15:15
А вот так?

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

channel=08; ch=${channel##0}; echo $ch

Надо ш, работает.
А как это расшифровывается? :blink:
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: bash, несколько вопросов

Сообщение diesel »

Zeus писал(а):
29.08.2006 15:46
diesel писал(а):
29.08.2006 15:15

А вот так?

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

channel=08; ch=${channel##0}; echo $ch

Надо ш, работает.
А как это расшифровывается? :blink:

${parameter#word}
${parameter##word}
The word is expanded to produce a pattern just as in pathname
expansion. If the pattern matches the beginning of the value
of parameter, then the result of the expansion is the expanded
value of parameter with the shortest matching pattern (the
‘‘#’’ case) or the longest matching pattern (the ‘‘##’’ case)
deleted. If parameter is @ or *, the pattern removal operation
is applied to each positional parameter in turn, and the expan-
sion is the resultant list. If parameter is an array variable
subscripted with @ or *, the pattern removal operation is
applied to each member of the array in turn, and the expansion
is the resultant list.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: bash, несколько вопросов

Сообщение Zeus »

Мда... чего только не бывает... :mellow:
Спасибо за ответы ;)
Спасибо сказали:
Аватара пользователя
Malcolm
Сообщения: 860
Статус: Изменник
ОС: Archlinux on IBM Z60m
Контактная информация:

Re: bash, несколько вопросов

Сообщение Malcolm »

Помогите, чего то я туплю:)
Надо сделать типа ls -R /path/to/ , но чтобы для каждого файла выводился полный путь.
man ls читал. может плохо?
Win7 on X200s || Android 2.3 on Galaxy Tab
Блог
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус
Контактная информация:

Re: bash, несколько вопросов

Сообщение KiWi »

find
Спасибо сказали:
Аватара пользователя
Malcolm
Сообщения: 860
Статус: Изменник
ОС: Archlinux on IBM Z60m
Контактная информация:

Re: bash, несколько вопросов

Сообщение Malcolm »

:))
вот я дурак :) спасибо :)
Win7 on X200s || Android 2.3 on Galaxy Tab
Блог
Спасибо сказали:
Аватара пользователя
Malcolm
Сообщения: 860
Статус: Изменник
ОС: Archlinux on IBM Z60m
Контактная информация:

Re: bash, несколько вопросов

Сообщение Malcolm »

Ну вот, надо список файлов впихнуть в MySQL. Делаю так

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

#!/bin/sh
while read line  # Построчное чтение файла от начала до конца...
do
  mysql -uroot -ppasswd -e"use ftp;"
  mysql -uroot -ppasswd -e"insert into search values (`$line`);"
done

exit 0

запускаю так:
/usr/bin/insert < /file/with/list
он мне выдаёт ошибку:
No database selectes;
Помогите плиз:)
Win7 on X200s || Android 2.3 on Galaxy Tab
Блог
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус
Контактная информация:

Re: bash, несколько вопросов

Сообщение KiWi »

Ты думаешь, что при втором запуске он знает что-нибудь о первом?
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash, несколько вопросов

Сообщение t.t »

(sash-kan @ Aug 14 2006, в 18:18) писал(а):sed -i -e '/определенный текст/d' /path/to/file
и вообще man sed
А можно ещё grep -v 'определенный текст' /path/to/file, и вообще man grep :)

(IFL @ Aug 22 2006, в 18:57) писал(а):Мусье мастер извращений)

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

t:~$ for i in `seq 1 1000000`; do echo $i >>1; done
t:~$ for i in `seq 2 20`; do cp 1 $i; done
t:~$ time for i in `seq 1 20`; do head -n 500000 $i | tail -n 1 >/dev/null; done

real    0m3.095s
user    0m1.213s
sys     0m1.424s
t:~$ time for i in `seq 1 20`; do cat $i | sed -n '500000p' >/dev/null; done

real    0m13.204s
user    0m9.132s
sys     0m2.228s

Так что я не был бы столь категоричен.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус
Контактная информация:

Re: bash, несколько вопросов

Сообщение KiWi »

t.t писал(а):
17.09.2006 14:30
Так что я не был бы столь категоричен.

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

$ for i in `seq 1 1000000`; do echo $i >>1; done
$ for i in `seq 2 20`; do cp 1 $i; done
$ time for i in `seq 1 20`; do head -n 500000 $i | tail -n 1 >/dev/null; done

real    0m0.572s
user    0m0.346s
sys     0m0.210s
$ time for i in `seq 1 20`; do cat $i | sed -n '500000p' >/dev/null; done

real    0m14.901s
user    0m14.353s
sys     0m0.399s
$ time for i in `seq 1 20`; do sed -n '500000p' $i >/dev/null; done

real    0m14.975s
user    0m14.657s
sys     0m0.146s

Бережём CPU time как самый драгоценный :P
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash, несколько вопросов

Сообщение t.t »

(IFL @ Sep 17 2006, в 14:01) писал(а):Бережём CPU time как самый драгоценный
По крайней мере, извращением я бы это точно не называл.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7
Контактная информация:

Re: bash, несколько вопросов

Сообщение soko1 »

Вопрос по case'у.
Необходимо задать диапазон значений, но он почему-то работает только с 0 по 9:

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

            case "$key" in
                [0-9] )
                ...

Как сделать после 10? Можно конечно глупо перечислять: 1|2|3|4..., но мне нужно диапазонами...
Спасибо.
Спасибо сказали:
Аватара пользователя
router
Сообщения: 363
ОС: Debian, на работе rhel

Re: bash, несколько вопросов

Сообщение router »

[0-9]*

добавлено:
Сначала ответил, затем подумал :(
Это не пойдёт

добавлено:
man bash

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

       If the extglob shell option is enabled using the shopt builtin, several
       extended  pattern  matching operators are recognized.  In the following
       description, a pattern-list is a list of one or more patterns separated
       by a |.  Composite patterns may be formed using one or more of the fol-
       lowing sub-patterns:

              ?(pattern-list)
                     Matches zero or one occurrence of the given patterns
              *(pattern-list)
                     Matches zero or more occurrences of the given patterns
              +(pattern-list)
                     Matches one or more occurrences of the given patterns


Итак,

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

shopt -s extglob

после этого
+([0-9])
проверено, работает
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7
Контактная информация:

Re: bash, несколько вопросов

Сообщение soko1 »

router,
shopt у меня нет=( а можно без bash-привязок?
тоесть мне нужно что-то на подобии:

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

case $key in
     [1-23])
          ....

Только если можно продемонстрируйте с наглядным примером, а то я уже все возможные способы перепробовал...
Спасибо сказали:
Аватара пользователя
router
Сообщения: 363
ОС: Debian, на работе rhel

Re: bash, несколько вопросов

Сообщение router »

soko1 писал(а):
16.10.2006 00:05
shopt у меня нет=( а можно без bash-привязок?

Для какой оболочки нужен скрипт? Из названия темы и синтаксиса case решил, что bash.
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7
Контактная информация:

Re: bash, несколько вопросов

Сообщение soko1 »

router писал(а):
16.10.2006 15:06
Для какой оболочки нужен скрипт? Из названия темы и синтаксиса case решил, что bash.

Для csh-подобных...Сорри, просто не хотел отдельную тему по этой мелочи поднимать.
Вот что мне подсказали (это не совсем то что надо, но уж лучше чем ничего):

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

case $key in
        ([1-9]|10|11|12|13)
        ...
      ;;
esac
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash, несколько вопросов

Сообщение t.t »

(soko1 @ Oct 16 2006, в 14:58) писал(а):[1-9]|10|11|12|13
[1-9]|1[0-3] -- то же самое, но короче. Дальше по аналогии, например, все одно- и двузначные числа: [1-9]|[1-9][0-9]
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7
Контактная информация:

Re: bash, несколько вопросов

Сообщение soko1 »

t.t писал(а):
16.10.2006 18:17
(soko1 @ Oct 16 2006, в 14:58) писал(а):[1-9]|10|11|12|13
[1-9]|1[0-3] -- то же самое, но короче. Дальше по аналогии, например, все одно- и двузначные числа: [1-9]|[1-9][0-9]

Огромное спасібо!
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7
Контактная информация:

Re: bash, несколько вопросов

Сообщение soko1 »

Ну, раз уж речь зашла о диапазонах...=) Как граммотно задать диапазон в while?
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: bash, несколько вопросов

Сообщение diesel »

soko1 писал(а):
17.10.2006 15:19
Ну, раз уж речь зашла о диапазонах...=) Как граммотно задать диапазон в while?

seq 10 20|while read i; do echo $i; done
или диапазон чего?
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7
Контактная информация:

Re: bash, несколько вопросов

Сообщение soko1 »

diesel писал(а):
17.10.2006 16:30
seq 10 20|while read i; do echo $i; done
или диапазон чего?

Что-то вроде:

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

while [ $key != [0-9] ]; do #но этот код не работает
...

А seq'а у меня в системе тоже нет - видать, это компонент который входит в bash...
Если бы был seq, то наверное код выглядел так:

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

while [ $key != `seq 10 20` ]; do
...

Да? Но мне нужно без него...
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: bash, несколько вопросов

Сообщение serzh-z »

soko1 писал(а):
17.10.2006 16:40
А seq'а у меня в системе тоже нет - видать, это компонент который входит в bash...
Не в bash, а в coreutils - а уж этот компонент просто обязан быть (в нем mkdir, cp, cat и т.д.).

P.S.: сорри не обратил внимание на FreeBSD, вероятно там и правда нет аналога coreutils...
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: bash, несколько вопросов

Сообщение diesel »

в такой формулировке seq бесполезна ....в любом случае

Вот такой тупой вариант:

read i; test=`echo $i|grep -e "^[1-9]$"`; while [ ! "$test" ]; do read i; test=`echo $i|grep -e "^[1-9]$"`; done

или проще:
read i; while [ ! "`echo $i|grep -e "^[1-9]$"`" ]; do read i; done
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7
Контактная информация:

Re: bash, несколько вопросов

Сообщение soko1 »

serzh-z писал(а):
17.10.2006 16:49
Не в bash, а в coreutils - а уж этот компонент просто обязан быть (в нем mkdir, cp, cat и т.д.).
P.S.: сорри не обратил внимание на FreeBSD, вероятно там и правда нет аналога coreutils...
Не, в портах то есть coreutils от GNU, но не хотелось бы из-за таких мелочей ставить его...


diesel писал(а):
17.10.2006 17:00
read i; test=`echo $i|grep -e "^[1-9]$"`; while [ ! "$test" ]; do read i; test=`echo $i|grep -e "^[1-9]$"`; done

Вот это выкрунтас! Спасибо. Может заодно и посоветуете выход из ситуации когда надо тупо писать `for i in 1 2 3 ...` (вот тут бы seq и пригодился) для больших диапазонов?=)
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: bash, несколько вопросов

Сообщение diesel »

soko1 писал(а):
17.10.2006 17:11
Вот это выкрунтас! Спасибо. Может заодно и посоветуете выход из ситуации когда надо тупо писать `for i in 1 2 3 ...` (вот тут бы seq и пригодился) для больших диапазонов?=)

еще один изврат, но я не знаю работает ли такое в csh:
i=10; while [ $i != 20 ]; do i=$[$i+1]; echo $i; done
Спасибо сказали:
Аватара пользователя
soko1
Сообщения: 265
Статус: лесной бздшник
ОС: freebsd7
Контактная информация:

Re: bash, несколько вопросов

Сообщение soko1 »

diesel писал(а):
17.10.2006 17:20
еще один изврат, но я не знаю работает ли такое в csh:
i=10; while [ $i != 20 ]; do i=$[$i+1]; echo $i; done

Тоесть этот код необходимо помещать между in `...` как я понял...да, я даже как-то не подумал над тем, что так можно сделать. Спб еще раз)
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: bash, несколько вопросов

Сообщение diesel »

soko1 писал(а):
17.10.2006 18:24
diesel писал(а):
17.10.2006 17:20

еще один изврат, но я не знаю работает ли такое в csh:
i=10; while [ $i != 20 ]; do i=$[$i+1]; echo $i; done

Тоесть этот код необходимо помещать между in `...` как я понял...да, я даже как-то не подумал над тем, что так можно сделать. Спб еще раз)

да нет ... не надо его туда помещать :) это тоже самое что for i in `seq 10 20`; do echo $i; done , где вместо echo $i надо помещать ваши операторы )
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash, несколько вопросов

Сообщение t.t »

(diesel @ Oct 17 2006, в 16:20) писал(а):i=10; while [ $i != 20 ]; do i=$[$i+1]; echo $i; done
Вообще-то, $[ использовать не рекомендуется. А рекомендуется -- $(( ... ))
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Ответить