bash, несколько вопросов
Модераторы: /dev/random, Модераторы разделов
-
- Сообщения: 694
Re: bash, несколько вопросов
У меня тогда тоже вопрос про bash:
есть у меня переменная
CHANNEL=08
А как из неё сделать другую переменную
CH=8
?
Т.е. как убрать ведущи(й,е) ноль?
Пробовал
let CH=$CHANNEL
но оно видимо считает, что ведущий ноль - это признак восмеричного числа и ругается на встречающиеся цифры > 7
есть у меня переменная
CHANNEL=08
А как из неё сделать другую переменную
CH=8
?
Т.е. как убрать ведущи(й,е) ноль?
Пробовал
let CH=$CHANNEL
но оно видимо считает, что ведущий ноль - это признак восмеричного числа и ругается на встречающиеся цифры > 7
-
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: bash, несколько вопросов
А вот так?
Код: Выделить всё
channel=08; ch=${channel##0}; echo $ch
-
- Сообщения: 694
Re: bash, несколько вопросов
diesel писал(а): ↑29.08.2006 15:15А вот так?
Код: Выделить всё
channel=08; ch=${channel##0}; echo $ch
Надо ш, работает.
А как это расшифровывается?

-
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: bash, несколько вопросов
Zeus писал(а): ↑29.08.2006 15:46diesel писал(а): ↑29.08.2006 15:15
А вот так?
Код: Выделить всё
channel=08; ch=${channel##0}; echo $ch
Надо ш, работает.
А как это расшифровывается?
${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.
-
- Сообщения: 694
Re: bash, несколько вопросов
Мда... чего только не бывает...
Спасибо за ответы

Спасибо за ответы

-
- Сообщения: 860
- Статус: Изменник
- ОС: Archlinux on IBM Z60m
Re: bash, несколько вопросов
Помогите, чего то я туплю
Надо сделать типа ls -R /path/to/ , но чтобы для каждого файла выводился полный путь.
man ls читал. может плохо?

Надо сделать типа ls -R /path/to/ , но чтобы для каждого файла выводился полный путь.
man ls читал. может плохо?
Win7 on X200s || Android 2.3 on Galaxy Tab
Блог
Блог
-
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
-
- Сообщения: 860
- Статус: Изменник
- ОС: Archlinux on IBM Z60m
-
- Сообщения: 860
- Статус: Изменник
- ОС: Archlinux on IBM Z60m
Re: bash, несколько вопросов
Ну вот, надо список файлов впихнуть в MySQL. Делаю так
запускаю так:
/usr/bin/insert < /file/with/list
он мне выдаёт ошибку:
No database selectes;
Помогите плиз
Код: Выделить всё
#!/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
Блог
Блог
-
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: bash, несколько вопросов
Ты думаешь, что при втором запуске он знает что-нибудь о первом?
-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: bash, несколько вопросов
А можно ещё grep -v 'определенный текст' /path/to/file, и вообще man grep(sash-kan @ Aug 14 2006, в 18:18) писал(а):sed -i -e '/определенный текст/d' /path/to/file
и вообще man sed

(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нεиж
-
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: bash, несколько вопросов
Код: Выделить всё
$ 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
-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: bash, несколько вопросов
По крайней мере, извращением я бы это точно не называл.(IFL @ Sep 17 2006, в 14:01) писал(а):Бережём CPU time как самый драгоценный
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: bash, несколько вопросов
Вопрос по case'у.
Необходимо задать диапазон значений, но он почему-то работает только с 0 по 9:
Как сделать после 10? Можно конечно глупо перечислять: 1|2|3|4..., но мне нужно диапазонами...
Спасибо.
Необходимо задать диапазон значений, но он почему-то работает только с 0 по 9:
Код: Выделить всё
case "$key" in
[0-9] )
...
Как сделать после 10? Можно конечно глупо перечислять: 1|2|3|4..., но мне нужно диапазонами...
Спасибо.
-
- Сообщения: 363
- ОС: Debian, на работе rhel
Re: bash, несколько вопросов
[0-9]*
добавлено:
Сначала ответил, затем подумал
Это не пойдёт
добавлено:
man bash
Итак,
после этого
+([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])
проверено, работает
-
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: bash, несколько вопросов
router,
shopt у меня нет=( а можно без bash-привязок?
тоесть мне нужно что-то на подобии:
Только если можно продемонстрируйте с наглядным примером, а то я уже все возможные способы перепробовал...
shopt у меня нет=( а можно без bash-привязок?
тоесть мне нужно что-то на подобии:
Код: Выделить всё
case $key in
[1-23])
....
Только если можно продемонстрируйте с наглядным примером, а то я уже все возможные способы перепробовал...
-
- Сообщения: 363
- ОС: Debian, на работе rhel
-
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: bash, несколько вопросов
Для csh-подобных...Сорри, просто не хотел отдельную тему по этой мелочи поднимать.
Вот что мне подсказали (это не совсем то что надо, но уж лучше чем ничего):
Код: Выделить всё
case $key in
([1-9]|10|11|12|13)
...
;;
esac
-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: bash, несколько вопросов
[1-9]|1[0-3] -- то же самое, но короче. Дальше по аналогии, например, все одно- и двузначные числа: [1-9]|[1-9][0-9](soko1 @ Oct 16 2006, в 14:58) писал(а):[1-9]|10|11|12|13
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: bash, несколько вопросов
Огромное спасібо!
-
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: bash, несколько вопросов
Ну, раз уж речь зашла о диапазонах...=) Как граммотно задать диапазон в while?
-
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
-
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: bash, несколько вопросов
Что-то вроде:
Код: Выделить всё
while [ $key != [0-9] ]; do #но этот код не работает
...
А seq'а у меня в системе тоже нет - видать, это компонент который входит в bash...
Если бы был seq, то наверное код выглядел так:
Код: Выделить всё
while [ $key != `seq 10 20` ]; do
...
Да? Но мне нужно без него...
-
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
Re: bash, несколько вопросов
Не в bash, а в coreutils - а уж этот компонент просто обязан быть (в нем mkdir, cp, cat и т.д.).
P.S.: сорри не обратил внимание на FreeBSD, вероятно там и правда нет аналога coreutils...
-
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: bash, несколько вопросов
в такой формулировке 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
Вот такой тупой вариант:
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
-
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: bash, несколько вопросов
Не, в портах то есть coreutils от GNU, но не хотелось бы из-за таких мелочей ставить его...
Вот это выкрунтас! Спасибо. Может заодно и посоветуете выход из ситуации когда надо тупо писать `for i in 1 2 3 ...` (вот тут бы seq и пригодился) для больших диапазонов?=)
-
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: bash, несколько вопросов
еще один изврат, но я не знаю работает ли такое в csh:
i=10; while [ $i != 20 ]; do i=$[$i+1]; echo $i; done
-
- Сообщения: 265
- Статус: лесной бздшник
- ОС: freebsd7
Re: bash, несколько вопросов
Тоесть этот код необходимо помещать между in `...` как я понял...да, я даже как-то не подумал над тем, что так можно сделать. Спб еще раз)
-
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: bash, несколько вопросов
да нет ... не надо его туда помещать

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