[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: вопрос по shell-программированию



On Thu, Feb 21, 2013 at 10:07:42PM +0600, Voland Levit wrote:
> Есть скрипт:
> 
> #!/bin/sh
> items="items.db"
> sales="sales.db"
> receivings="receivings.db"
> errors="errors.db"
> 
> clear
> 
> echo -n "Input item: "
> read x
> 
> if [ "$(grep -i "$x" $items)" = "" ]; then
>         echo "No items in database"
>         echo "$(date '+%Y-%m-%d %H:%M') $x" >> error.db 
> else
>         grep $x $items | awk -F, '{printf "%-50s %10s\n", $2, $5}'
> fi
> 
> exit 0
> 
> Кусок items.db
> 
> 2000785666604,Giulia Funny B53 Uni melange grigio,прочее,260.00,260.00,1.00
> 2280000001339,Venera 9400136 перчатки,прочее,380.00,380.00,1.00
> 000036950010,Venera 9500136 перчатки,прочее,320.00,320.00,1.00
> 2280000000233,Полотенце «Иди в баню»,прочее,85.00,85.00,1.00
> 2280000000042,Авангард полотенце махр.,прочее,98.00,98.00,1.00
> 2280000001254,Донецк.мануф. ПЛ-601-130 полотнце х/б махр.,прочее,190.00,190.00,1.00
> 
> Проблема в строке проверки условния с grep. По задумке, если не находит
> вхождение(-ий) в базе данных (проверка пустая ли строка) то выводит сообщение
> и логирует. Проблема в том, что скрипт правильно работает только в случае,
> если на вход подать число, к примеру 000. Но слова Дон и дон, уже подпадают
> под разные ветвления. Как сделать, чтобы скрипт "искал" строку (включая 
> словосочитания) нормально. Вместо "$x" пробовал "\"$x\"" - не помогает.

Попробуйте, например, "правильную" форму использования grep/fgrep/egrep
только для проверки, есть ли чего-то в файле или нет - флаг "-q":

if fgrep -qe "$x" "$items"; then
	# есть
else
	# нету
fi

Так решаете и проблему quoting-а.

Кстати, если Вам действительно не нужна обработка metacharacters в тем,
что ищете, можно пользовать fgrep вместо grep - так не будет false
positives, напр. искать "а.в" и "найти" "абв".

Всего лучшего,
Петр

-- 
Peter Pentchev	roam@ringlet.net roam@FreeBSD.org p.penchev@storpool.com
PGP key:	http://people.FreeBSD.org/~roam/roam.key.asc
Key fingerprint 2EE7 A7A5 17FC 124C F115  C354 651E EFB0 2527 DF13
This sentence contradicts itself - or rather - well, no, actually it doesn't!

Attachment: signature.asc
Description: Digital signature


Reply to: