Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Экранирование симвоволов BASH  (Прочитано 2260 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн evtuhovdo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
Экранирование симвоволов BASH
« : 04 Февраля 2012, 09:43:16 »
Имеется GPS трекер он передаёт данные TCP пакетами. Вот данные от него.
nc -lk 22000
$4Vx----U043214.000,A,9911.5531,N,1053.1173,E,0.00,207,040212,,*08|0.9|177|2000|0007,0005|00FA0001983C010F|1E|000039FD--

Написал скрипт
#!/bin/bash

if [ "$1" ]
then
  PORT=$1
else
  PORT=22000
fi

mkfifo fifo 2>/dev/null
nc -lk $PORT <fifo | while read line; do
         echo $line >> dump.nc
         $(php parser.php $line)
done >fifo

Но тут возникает проблема. после $$ могут вствечаться спец символы, и в конце идёт |. Из-за этого данные передаються не полностью или fifo хереет от этих данных.
В итоге в файле имеем записи
$$
$$
$$
$$
и т.д.

Голову ломаю как мне эти данные заэкронировать.

Пробовал обработать их hexdump - не то. Данные конечно все верные, но вот обробатывать их с точки зрения логики анриал.
ubuntu server 10.04 lucid

andrey_p

  • Гость
Re: Экранирование симвоволов BASH
« Ответ #1 : 04 Февраля 2012, 09:53:26 »
Кавычки вокруг переменных! Лучше приучить себя их ставить всегда, когда не надо - оболочка подскажет, а вот наоборот не всегда.
         $(php parser.php "$line")

Оффлайн evtuhovdo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
Re: Экранирование симвоволов BASH
« Ответ #2 : 04 Февраля 2012, 10:00:10 »
echo "$line" >> dump.nc
$(php parser.php "$line")

тоже выдаёт $$
ubuntu server 10.04 lucid

andrey_p

  • Гость
Re: Экранирование симвоволов BASH
« Ответ #3 : 04 Февраля 2012, 10:08:42 »
Подожди, зачем вообще fifo здесь? И какая вообще задача? Почему не
nc -lk $PORT | while -r read line; do
     # do what you want with "$line"   
done



Оффлайн evtuhovdo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
Re: Экранирование симвоволов BASH
« Ответ #4 : 04 Февраля 2012, 10:14:27 »
nc -lk $PORT | while -r read line; do
    # do what you want with "$line"
done
результат тотже.

Цель: Передача информации на парсер, хранение и анализ полученой инфы.
ubuntu server 10.04 lucid

andrey_p

  • Гость
Re: Экранирование симвоволов BASH
« Ответ #5 : 04 Февраля 2012, 10:20:53 »
Что значит тот же?
nc -lk 22000и
nc -lk 22000 | while -r read line; do
  echo "$line"
done
выдают разную информацию? Этого не должно быть. Что конкретно выдается? И да, заодно (ну нет у меня GPS) - с какой периодичностью поступает информация, как часто обновляется? Может в эту сторону копать надо.

Оффлайн evtuhovdo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
Re: Экранирование симвоволов BASH
« Ответ #6 : 04 Февраля 2012, 10:31:11 »
nc -lk 22000

Выхлоп:
$$4Vx----U062129.000,A,5555.5543,N,08888.0991,E,0.00,308,040212,,*01|0.8|133|2000|000D,0004|00FA0001983C0119|1D|00003D84~-
$$4Vx----U062231.000,A,5555.5543,N,08888.0991,E,0.00,308,040212,,*0B|0.9|133|2000|000E,0005|00FA0001983C0119|1D|00003D84--
$$4Vx----U062331.000,A,5555.5543,N,08888.0991,E,0.00,308,040212,,*0A|1.0|133|2000|0005,0005|00FA0001983C010F|1D|00003D84

----------------------------------------------------
nc -lk 22000 | while -r read line; do
  echo "$line"
done

Выхлоп:
$$
$$
$$
$$
$$
ubuntu server 10.04 lucid

andrey_p

  • Гость
Re: Экранирование симвоволов BASH
« Ответ #7 : 04 Февраля 2012, 10:43:53 »
Во-первых я ступил - while read -r lineВо-вторых, ну как бы не должно так быть:
$ cat file
$$4Vx----U062129.000,A,5555.5543,N,08888.0991,E,0.00,308,040212,,*01|0.8|133|2000|000D,0004|00FA0001983C0119|1D|00003D84~-
$$4Vx----U062231.000,A,5555.5543,N,08888.0991,E,0.00,308,040212,,*0B|0.9|133|2000|000E,0005|00FA0001983C0119|1D|00003D84--
$$4Vx----U062331.000,A,5555.5543,N,08888.0991,E,0.00,308,040212,,*0A|1.0|133|2000|0005,0005|00FA0001983C010F|1D|00003D84
yazu@kubuntu ~/tmp
$ cat file |  while read -r line; do echo "$line"; done
$$4Vx----U062129.000,A,5555.5543,N,08888.0991,E,0.00,308,040212,,*01|0.8|133|2000|000D,0004|00FA0001983C0119|1D|00003D84~-
$$4Vx----U062231.000,A,5555.5543,N,08888.0991,E,0.00,308,040212,,*0B|0.9|133|2000|000E,0005|00FA0001983C0119|1D|00003D84--
$$4Vx----U062331.000,A,5555.5543,N,08888.0991,E,0.00,308,040212,,*0A|1.0|133|2000|0005,0005|00FA0001983C010F|1D|00003D84
То есть чудеса.
« Последнее редактирование: 04 Февраля 2012, 10:45:29 от andrey_p »

Оффлайн evtuhovdo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
Re: Экранирование симвоволов BASH
« Ответ #8 : 04 Февраля 2012, 10:56:16 »
я схожу с ума  :idiot2:.

Действительно, пример
,
#!/bin/bash
line="$$4Vx----032157.000,A,5555.5549,N,0888.1051,E,0.00,7,040212,,*0F|1.0|158|2000|0007,0004|00FA0001983C0119|1C|000037"
echo $line

Выхлоп:
218734Vx----032157.000,A,5555.5549,N,0888.1051,E,0.00,7,040212,,*0F|1.0|158|2000|0007,0004|00FA0001983C0119|1C|000037

Видно что он отличается от входных данных.


вот ещё
nc -lk 22000 |  while read -r line; do echo "$line"; done
$$
$$
$$
$$
$$
$$



А вот это чудо работает как часы, но не подходит по требованиям передачи данных в парсер сразу после их получения

nc -lk 22000 > ololo.nc
cat ololo.nc
$4Vx----U065909.000,A,5555.5378,N,8888.1009,E,0.00,196,040212,,*0E|1.8|129|2000|0007,0007|00FA0001983C0119|1D|00004370h




« Последнее редактирование: 04 Февраля 2012, 11:04:23 от evtuhovdo »
ubuntu server 10.04 lucid

andrey_p

  • Гость
Re: Экранирование симвоволов BASH
« Ответ #9 : 04 Февраля 2012, 11:00:20 »
С $$ все понятно - двойные кавычки не экранируют переменные (только сохраняют пробелы) - то есть $$ замещается своим значением - это значение PID оболочки, а вот с nc сам не понимаю... :(
« Последнее редактирование: 04 Февраля 2012, 11:02:29 от andrey_p »

Оффлайн evtuhovdo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
Re: Экранирование симвоволов BASH
« Ответ #10 : 04 Февраля 2012, 11:14:28 »
nc -lk 22000 | while read -r line; do
        echo ${line//\$/X}
done


Выхлоп
XX
XX
XX
XX


 :idiot2: :idiot2: :idiot2: :idiot2:

Пользователь решил продолжить мысль 04 Февраля 2012, 12:59:19:
Быть может есть иной способ передать данные php скрипту сразу после поступления данных.

Например как в php организовать приём
netcat -lk 22000 | parser.php
или что-то в этом роде


Пользователь решил продолжить мысль 04 Февраля 2012, 17:46:46:
Придумал ещё один вариант
echo $(nc -lk 22000 | xxd -p -l 127| tr '\n' 'X')Выхлоп в HEX
(Нажмите, чтобы показать/скрыть)

Т.е. структура описанная ниже уже вполне приемлима
php parser.php $(nc -lk 22000 | xxd -p -l 127| tr '\n' 'X')

Но непрерывный поток хз как создать. Т.е. Вот такой код ничего не выдаёт. просто висит и слушает. Развития цикл я так понял не получает.
echo $(nc -lk 22000 | xxd -p | tr '\n' 'X') | while read -r line; do
        echo "Строка:  $line"
        $(php parser.php $line)
done

понятное дело если xxd дать ключ -l 127 то данные на выхлоп летят
« Последнее редактирование: 04 Февраля 2012, 17:46:46 от evtuhovdo »
ubuntu server 10.04 lucid

 

Страница сгенерирована за 0.066 секунд. Запросов: 25.