bash, несколько вопросов
Модераторы: /dev/random, Модераторы разделов
Re: bash, несколько вопросов
У меня тогда тоже вопрос про bash:
есть у меня переменная
CHANNEL=08
А как из неё сделать другую переменную
CH=8
?
Т.е. как убрать ведущи(й,е) ноль?
Пробовал
let CH=$CHANNEL
но оно видимо считает, что ведущий ноль - это признак восмеричного числа и ругается на встречающиеся цифры > 7
есть у меня переменная
CHANNEL=08
А как из неё сделать другую переменную
CH=8
?
Т.е. как убрать ведущи(й,е) ноль?
Пробовал
let CH=$CHANNEL
но оно видимо считает, что ведущий ноль - это признак восмеричного числа и ругается на встречающиеся цифры > 7
Re: bash, несколько вопросов
А вот так?
Код: Выделить всё
channel=08; ch=${channel##0}; echo $ch
Re: bash, несколько вопросов
diesel писал(а): ↑29.08.2006 15:15А вот так?
Код: Выделить всё
channel=08; ch=${channel##0}; echo $ch
Надо ш, работает.
А как это расшифровывается?
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.
Re: bash, несколько вопросов
Мда... чего только не бывает...
Спасибо за ответы
Спасибо за ответы
Re: bash, несколько вопросов
Помогите, чего то я туплю
Надо сделать типа ls -R /path/to/ , но чтобы для каждого файла выводился полный путь.
man ls читал. может плохо?
Надо сделать типа ls -R /path/to/ , но чтобы для каждого файла выводился полный путь.
man ls читал. может плохо?
Win7 on X200s || Android 2.3 on Galaxy Tab
Блог
Блог
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
Блог
Блог
Re: bash, несколько вопросов
Ты думаешь, что при втором запуске он знает что-нибудь о первом?
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нεиж
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
Re: bash, несколько вопросов
По крайней мере, извращением я бы это точно не называл.(IFL @ Sep 17 2006, в 14:01) писал(а):Бережём CPU time как самый драгоценный
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Re: bash, несколько вопросов
Вопрос по case'у.
Необходимо задать диапазон значений, но он почему-то работает только с 0 по 9:
Как сделать после 10? Можно конечно глупо перечислять: 1|2|3|4..., но мне нужно диапазонами...
Спасибо.
Необходимо задать диапазон значений, но он почему-то работает только с 0 по 9:
Код: Выделить всё
case "$key" in
[0-9] )
...
Как сделать после 10? Можно конечно глупо перечислять: 1|2|3|4..., но мне нужно диапазонами...
Спасибо.
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])
проверено, работает
Re: bash, несколько вопросов
router,
shopt у меня нет=( а можно без bash-привязок?
тоесть мне нужно что-то на подобии:
Только если можно продемонстрируйте с наглядным примером, а то я уже все возможные способы перепробовал...
shopt у меня нет=( а можно без bash-привязок?
тоесть мне нужно что-то на подобии:
Код: Выделить всё
case $key in
[1-23])
....
Только если можно продемонстрируйте с наглядным примером, а то я уже все возможные способы перепробовал...
Re: bash, несколько вопросов
Для csh-подобных...Сорри, просто не хотел отдельную тему по этой мелочи поднимать.
Вот что мне подсказали (это не совсем то что надо, но уж лучше чем ничего):
Код: Выделить всё
case $key in
([1-9]|10|11|12|13)
...
;;
esac
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нεиж
Re: bash, несколько вопросов
Огромное спасібо!
Re: bash, несколько вопросов
Ну, раз уж речь зашла о диапазонах...=) Как граммотно задать диапазон в while?
Re: bash, несколько вопросов
Что-то вроде:
Код: Выделить всё
while [ $key != [0-9] ]; do #но этот код не работает
...
А seq'а у меня в системе тоже нет - видать, это компонент который входит в bash...
Если бы был seq, то наверное код выглядел так:
Код: Выделить всё
while [ $key != `seq 10 20` ]; do
...
Да? Но мне нужно без него...
- serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
- Контактная информация:
Re: bash, несколько вопросов
Не в bash, а в coreutils - а уж этот компонент просто обязан быть (в нем mkdir, cp, cat и т.д.).
P.S.: сорри не обратил внимание на FreeBSD, вероятно там и правда нет аналога coreutils...
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
Re: bash, несколько вопросов
Не, в портах то есть coreutils от GNU, но не хотелось бы из-за таких мелочей ставить его...
Вот это выкрунтас! Спасибо. Может заодно и посоветуете выход из ситуации когда надо тупо писать `for i in 1 2 3 ...` (вот тут бы seq и пригодился) для больших диапазонов?=)
Re: bash, несколько вопросов
еще один изврат, но я не знаю работает ли такое в csh:
i=10; while [ $i != 20 ]; do i=$[$i+1]; echo $i; done
Re: bash, несколько вопросов
Тоесть этот код необходимо помещать между in `...` как я понял...да, я даже как-то не подумал над тем, что так можно сделать. Спб еще раз)
Re: bash, несколько вопросов
да нет ... не надо его туда помещать это тоже самое что for i in `seq 10 20`; do echo $i; done , где вместо echo $i надо помещать ваши операторы )
Re: bash, несколько вопросов
Вообще-то, $[ использовать не рекомендуется. А рекомендуется -- $(( ... ))(diesel @ Oct 17 2006, в 16:20) писал(а):i=10; while [ $i != 20 ]; do i=$[$i+1]; echo $i; done
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж