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: