IF [ ?regex_cmd? "my string" ] THEN... FI, если в "my string" найдено регулярное выражение?Ну, скажем, всем файлам *cgi$ надо chmod o+x
Внимание! маны читаю. соловьёва сижу читаю.
в исходниках рою, пока не нарыл.подскажите, кто знает готовый рецепт.
Спасибо.
>IF [ ?regex_cmd? "my string" ] THEN... FI, если в "my string"
>найдено регулярное выражение?
>
> Ну, скажем, всем файлам *cgi$ надо chmod o+x
>
> Внимание! маны читаю. соловьёва сижу читаю.
> в исходниках рою, пока не нарыл.
>
> подскажите, кто знает готовый рецепт.
> Спасибо.
Да вы не умничайте, вы пальцем покажите... :-)
Иными словами, опишите более подробно и менее сумбурно стоящую перед вами
задачу. А то у вас не сообщение, а какой-то винегрет с кашей. Начнем с
того, что "true" - это не 1, а 0. Что у вас за ?regex_cmd? такая? Если
"всем файлам *cgi$ надо chmod o+x", то это так делается:$ chmod o+x *cgi$
или так:
$ find /where/to/search -type f -name "*cgi$" -exec chmod o+x {} \;
В общем, чего хотите-то? ;-)
>того, что "true" - это не 1, а 0. Что у вас
Ммм, а вроде всегда true было не 0...
>>того, что "true" - это не 1, а 0. Что у вас
>Ммм, а вроде всегда true было не 0...А что проверить так трудно?!
[ 0 ] && echo "TRUE"
>[ 0 ] && echo "TRUE"
И чего?:)
Это что?:)
Эта Ваша конструкция означает "если код выхода последней команды 0, то написать "TRUE" " :) , то есть если 0=0 (то есть равенство 0=0 истинно(TRUE)):)
>>[ 0 ] && echo "TRUE"
>И чего?:)
>Это что?:)А теперь плавненько снимаемся с ручника и начинаем думать и вникать.
while [ ИСТИНА ] что-то делать.
while [ 0 ]; do yes; doneСамостоятельно додумываем чем же таки равна истина...
>>>[ 0 ] && echo "TRUE"
>>И чего?:)
>>Это что?:)
Друзья!
МНЕ НАДО только узнать, есть ли в строке регулярное выражение?
Что-то типа grep, только чтобы возвращал ЛОГИЧЕСКОЕ значение
для IF [ .....
>>>>[ 0 ] && echo "TRUE"
>>>И чего?:)
>>>Это что?:)
>
>
> Друзья!
> МНЕ НАДО только узнать, есть ли в строке регулярное выражение?
> Что-то типа grep, только чтобы возвращал ЛОГИЧЕСКОЕ значение
> для IF [ .....
>
>
Это самое логическое значение выдает практически любая программа в
юниксах. Код завершения (exit code) называется. В вашем случае можно
сделать так:[ `echo $MYSTRING | grep $REGEXP` ] && echo "Regexp found" || echo "Regexp not found"
или более развернуто:
if [ `echo $MYSTRING | grep $REGEXP` ]
then
echo "Regexp found"
else
echo "Regexp not found"
fiЕсли указанная в квадратных скобках команда выполняется успешно, то она
возвращает 0 (истина), в противном случае код завершения не равен нулю.
>if [ `echo $MYSTRING | grep $REGEXP` ]
>then
> echo "Regexp found"
>else
> echo "Regexp not found"
>fiСпасибиЩе ОгромадноЕ. Работает.
А как насчёт экранирования пробелов?
for FILE in `ls -a | sed -e 's/\ /\\ /g'`
do
echo $FILE
doneКручу по всякому, чсё равно имя с пробелами в FILE засунуть не получается.
Есть рецепт?
>А как насчёт экранирования пробелов?
>for FILE in `ls -a | sed -e 's/\ /\\ /g'`
>do
> echo $FILE
>done
>
>Кручу по всякому, чсё равно имя с пробелами в FILE засунуть не
>получается.
>Есть рецепт?
Есть. Несколько измените цикл и используйте кавычки:ls -a | while read FILE
do
echo "$FILE"
done
>>А как насчёт экранирования пробелов?>ls -a | while read FILE
>do
> echo "$FILE"
>doneСпасибо, УЧИТЕЛЬ!!!!
Мясо ваше, кости наши :-)))
Вдогонку: вам бы не помешало что-нибудь по программированию в shell
почитать. Например, это: http://gazette.lrn.ru/rus/articles/abs-guide/
>почитать. Например, это: http://gazette.lrn.ru/rus/articles/abs-guide/Обязательно, спасибо за линк
>Посвящается Аните -- источнику очарованияЭто автор свой комп называет?
Ах, как романтично!Ж-)
>Да вы не умничайте, вы пальцем покажите... :-)
>В общем, чего хотите-то? ;-)нужда древняя, три раза писал, куда засунул - хрен знает. надо установить доступ в каталоге www после копирования-разархивирования. По-умолчанию у меня umask 27, поэтому апачу файлики недоступны. И ftpd права сам не скопирует, etc.
Накатал такой скрипт
set PWD = `pwd` ;
for FILES in `ls -a`
do
if [ $FILES = "." -o $FILES = ".." ]
then
continue
fiif [ $FILES = "CVS" ]
then
chmod 700 $FILES
continue
fiecho -n "$PWD/$FILES"
if [ -d $FILES ]
then
chmod 755 $FILES
echo " chmod 755"
cd $FILES
setmod
cd ..
continue
fi# а здесь хочу поствить 755, если $FILES содержит regexp.
# ну там *cgi$ или *.PL$ , etc.
# Как?chmod 644 $FILES
echo " chmod 644"
donechmod 755 .
#EOF
Скрипт называется setmod, он себя рекурсивно вызывает, если каталог.
И ещё трабл - если в имени файла пробелы. Как ls объяснить, чтобы
экранировал \?
>И ещё трабл - если в имени файла пробелы. Как ls объяснить,
>чтобы экранировал \?man find, в частности -print0. А вообще вместо всего скрипта:
chmod CVS 700
find ./ -print0 | grep -v CVS | xargs chmod 755
find ./ -type f -name '*cgi' -print0 | grep -v CVS | xargs chmod 644Или ещё короче - поставить "правильную" umask и запускать tar с ключом --no-same-permissions.
>man find, в частности -print0. А вообще вместо всего скрипта:есть версия с find.
но если полной path будет длиннее 1024 (или 4096), не работает ни
find, ни rm, ни chmod -Rрекурсия позволяет пройтись по всему дереву.
>Или ещё короче - поставить "правильную" umask и запускать tar с ключом
"правильная" umask мне нужна для каталога www.
мой каталог www у меня на столе, на рабочей станции.
на сервере я могу поставить "правильную" umask, но всё равно
есть файлы, доступ к которым я хотел бы регулировать.
Я ответа на исходный вопрос "какой командой SHELL можно вернуть true.." так ответа и не увидел. Вставлю свои пять копеек, а точнее двоеточие ибо
: - есть пустой оператор шелла и всегда возвращае нулевой код завершения, например:while :
do
echo вечность навсегда
sleep 5
done
>Я ответа на исходный вопрос "какой командой SHELL можно вернуть true.." так
>ответа и не увидел.Таки прочтите это обсуждение еще раз и повнимательнее. ;-)
Во-первых, исходный вопрос выглядит так: "какой командой SHELL можно вернуть 1 (true)
оператору IF [ ?regex_cmd? "my string" ] THEN... FI, если в "my string" найдено регулярное
выражение?" - он начинается в заголовке, а продолжается уже в теле сообщения.Во-вторых, вопрос сей был поставлен некорректно из-за имевшегося (и успешно
ликвидированного) пробела в знаниях у echo (автора темы).Ну и в-третьих, даже в некорректно заданном вопросе echo не просил вечного TRUE :-)
P.S. Да и за прошедшие три месяца он наверняка узнал о том, что такое пустой оператор в
bash (по крайней мере, я на это надеюсь :-)).