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

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



Voland Levit -> debian-russian@lists.debian.org  @ Thu, 21 Feb 2013 22:07:42 +0600:

 VL> Есть скрипт:

 VL> #!/bin/sh
 VL> items="items.db"
 VL> sales="sales.db"
 VL> receivings="receivings.db"
 VL> errors="errors.db"

 VL> clear

 VL> echo -n "Input item: "
 VL> read x

 VL> if [ "$(grep -i "$x" $items)" = "" ]; then
 VL>         echo "No items in database"
 VL>         echo "$(date '+%Y-%m-%d %H:%M') $x" >> error.db 
 VL> else
 VL>         grep $x $items | awk -F, '{printf "%-50s %10s\n", $2, $5}'
 VL> fi

 VL> exit 0

 VL> Кусок items.db

 VL> 2000785666604,Giulia Funny B53 Uni melange grigio,прочее,260.00,260.00,1.00
 VL> 2280000001339,Venera 9400136 перчатки,прочее,380.00,380.00,1.00
 VL> 000036950010,Venera 9500136 перчатки,прочее,320.00,320.00,1.00
 VL> 2280000000233,Полотенце «Иди в баню»,прочее,85.00,85.00,1.00
 VL> 2280000000042,Авангард полотенце махр.,прочее,98.00,98.00,1.00
 VL> 2280000001254,Донецк.мануф. ПЛ-601-130 полотнце х/б махр.,прочее,190.00,190.00,1.00

 VL> Проблема в строке проверки условния с grep. По задумке, если не находит
 VL> вхождение(-ий) в базе данных (проверка пустая ли строка) то выводит сообщение
 VL> и логирует. Проблема в том, что скрипт правильно работает только в случае,
 VL> если на вход подать число, к примеру 000. Но слова Дон и дон, уже подпадают
 VL> под разные ветвления. Как сделать, чтобы скрипт "искал" строку (включая 
 VL> словосочитания) нормально. Вместо "$x" пробовал "\"$x\"" - не помогает.

Ну, начнем с того, что у

grep -i "$x" $items 

(в if) и 

grep $x $items

(в else) результаты различны, причем как раз на Дон и дон. Если в обоих
случаях написать одинаково (правильно написано в if) и запускать в
правильной локали, результат может стать гораздо лучше. Остальные
улучшения, написанные до меня, про -q, -e и fgrep, тоже в тему.


Reply to: