Есть скрипт на bash, который должен сравнивать значения получаемые с сайта, вот собственно он сам:
example=$(cat ~/example)
curl somesite.com > ~/match
match=$(cat ~/match)
if [[ "$example" == "$match" ]]
then
echo match!
else
echo not match...
fi
В файле example лежит тоже самое значение что и в файле match. Почему-то сначала все работает, показывает что значения равны, но если запустить скрипт еще раз - не совподают. Сам проверил - все одинаково, ЧЯДНТ?
Я проверил diff'ом, сначала опять же были идентичны, потом курлом обновил один файл - сказал что отличаются, потом опять скачал курлом и записал в тот же файл - опять идентичны, мистика.
Завязывайте с example=$(cat ~/example), до добра такой стиль не доведёт. если надо сравнивать файлы - используйте программу для сравнения файлов.
Ну иногда таки надо сравнивать содержимое файла и сформированное значение в переменной, скажем чтобы вначале сравнить и только если изменилось, то изменить файл. У меня была такая задача. Но да, у example=$(cat ~/example) есть неприятная особенность — последний <CR> неопределен, есть ли, нет ли - в переменной его не будет. Так что для себя я сделал такую функцию:
Удобство read тут ещё в том, что $1 превращает в косвенное имя, то есть функция вызывается с именем переменной и не надо извращаться с глобальными переменными или eval. И заметьте - никакого fork-а тут нет, в отличии от cmp/cat.
Ну иногда таки надо сравнивать содержимое файла и сформированное значение в переменной
Всякое бывает, да. Но тут человек целую веб-страницу в переменную засовывает, это как-то… некрасиво, имхо. Ну и я вот зная, что $() и ` ` как-то по-разному ведут себя с whitespace и мне лениво всё это помнить в подробностях и я, не стесняясь fork+exec, вызываю юниксовые утилиты. Иногда колеблюсь, когда получаются сотни запусков в секунду (как недавно было с find -exec sh -c "..." \; по потом думаю - да и чёрт с ним).
А иногда я тупо тяну файлы в скрипт как есть, используя bash как примитивный шаблонизатор:
Всякое бывает, да. Но тут человек целую веб-страницу в переменную засовывает, это как-то… некрасиво, имхо.
Вот моё всякое оно самое и есть — целая страница. Для современности мегабайт туда, мегабайт сюда — фигня война.
как-то по-разному ведут себя с whitespace и мне лениво всё это помнить в подробностях
Для html это важно, например, <img src=1><img src=2> и тоже самое через пробел/enter — совсем разный результат. Потому пара моих шаблонов не содержат последнего CR.
Оно у вас не сможет обработать выхлоп того-же curl.
Оно делает ровно то, что написано :)
Я бы перенаправление выкинул
Чтобы везде в огромном неинтерактивном скрипте писать перенаправление при каждом вызове только для того, чтобы функция могла читать из stdin? Да ну нафиг. :)