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


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Подскажите по bash.  (Прочитано 3620 раз)

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

Оффлайн Jursha

  • Автор темы
  • Участник
  • *
  • Сообщений: 230
    • Просмотр профиля
Подскажите по bash.
« : 29 Декабрь 2015, 13:43:03 »
Есть не большой скрипт для взятия из xml состояния погоды и вывода его на русском.
(Нажмите, чтобы показать/скрыть)
При запуске сыпит ошибками /home/juriy/222.sh: 13: [: Light: unexpected operator
и так много строк. Вроде нужно в $cond указать, чтобы elif [ $cond = Light Snow ] читалась как одно значение, но чем только не пробовал выделять (и одинарные кавычки и двойные, и тильду вместо них) всё та же ошибка.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4073
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Подскажите по bash.
« Ответ #1 : 29 Декабрь 2015, 14:02:23 »
elif [ $cond = "Light Snow" ]
??
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Jursha

  • Автор темы
  • Участник
  • *
  • Сообщений: 230
    • Просмотр профиля
Re: Подскажите по bash.
« Ответ #2 : 29 Декабрь 2015, 14:10:04 »
elif [ $cond = "Light Snow" ]
??
juriy@my-pk:~$ sh /home/juriy/222.sh
/home/juriy/222.sh: 13: [: missing ]
и так до 154 строки

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6009
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Подскажите по bash.
« Ответ #3 : 29 Декабрь 2015, 14:12:34 »
alsoijw,
Код: Bash
  1. [ "$cond" = "Light Snow" ]
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Jursha

  • Автор темы
  • Участник
  • *
  • Сообщений: 230
    • Просмотр профиля
Re: Подскажите по bash.
« Ответ #4 : 29 Декабрь 2015, 14:19:08 »
Всем спасибо. Долго бы я думал и гадал, что переменную "$cond" тоже нужно в кавычки закрывать.

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6009
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Подскажите по bash.
« Ответ #5 : 29 Декабрь 2015, 14:31:21 »
А вообще что это за безумие с if
Код: Bash
  1. declare -A wdict
  2. wdict=(
  3. [AM Snow Showers]="Утром снегопад"
  4. [Blustery]="Ветрено"
  5. [Calm]="Штиль"
  6. [Clear]="Ясно"
  7. [Cloudy]="Облачно"
  8. [Drifting Snow]="Поземка"
  9. [Drizzle]="Моросящий дождь"
  10. [Dust]="Пыль"
  11. [Fair]="Ясно"
  12. [Few Snow Showers]="Небольшой снегопад"
  13. [Fog]="Густой туман"
  14. [Freezing Drizzle]="Изморозь"
  15. [Freezing Rain]="Ледяной дождь"
  16. [Hail]="Град"
  17. [Haze]="Слабый туман"
  18. [Heavy Rain]="Сильный дождь"
  19. [Heavy Snow]="Сильный снег"
  20. [Hot]="Жарко"
  21. [Hurricane]="Ураган"
  22. [Isolated Thunderstorms]="Временами грозы"
  23. [Light Rain]="Небольшой дождь"
  24. [Light Snow]="Небольшой снег"
  25. [Light Snow Showers]="Сильный снегопад"
  26. [Mixed Precipitation]="Смешанные осадки"
  27. [Mixed Rain and Hail]="Дождь с градом"
  28. [Mixed Rain and Sleet]="Дождь с мокрым снегом"
  29. [Mixed Rain and Snow]="Дождь со снегом"
  30. [Mostly Cloudy]="Переменная облачность"
  31. [Mostly Sunny]="Преимуществеено солнечно"
  32. [Overcast]="Облачно"
  33. [Partly Cloudy]="Переменная облачность"
  34. [PM Snow Showers]="Ночью снегопад"
  35. [Rain]="Дождь"
  36. [Scattered Showers]="Местами грозы"
  37. [Scattered Snow Showers]="Местами снег"
  38. [Severe Thunderstorms]="Сильный дождь"
  39. [Scattered Thunderstorms]="Местами грозы"
  40. [Sleet]="Гололед"
  41. [Smoke]="Туман"
  42. [Snow]="Снег"
  43. [Snow Flurries]="Снегопад"
  44. [Snow Showers]="Снегопад"
  45. [Snow Showers Early]="Утром снегопад"
  46. [Snow Showers Late]="Позднее снег"
  47. [Thunderstorms]="Гроза"
  48. [Tornado]="Торнадо"
  49. [Tropical Storm]="Тропический шторм"
  50. [Windy]="Ветер"
  51. )
  52. echo "$cond = ${wdict[cond]}"
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Jursha

  • Автор темы
  • Участник
  • *
  • Сообщений: 230
    • Просмотр профиля
Re: Подскажите по bash.
« Ответ #6 : 29 Декабрь 2015, 14:53:16 »
Ну так, как в манах показали так и пишу. Подсказать не кому.

shura1

  • Гость
Re: Подскажите по bash.
« Ответ #7 : 29 Декабрь 2015, 15:37:43 »
Вот такая функция работает с /bin/sh (в Ubuntu это dash) без необходимости использовать bash версии 4.х
wheather_dict () {
cat <<END | grep "$1" | cut -d= -f2
AM Snow Showers=Утром снегопад
Blustery=Ветрено
Calm=Штиль
Clear=Ясно
Cloudy=Облачно
Drifting Snow=Поземка
Drizzle=Моросящий дождь
Dust=Пыль
Fair=Ясно
Few Snow Showers=Небольшой снегопад
Fog=Густой туман
Freezing Drizzle=Изморозь
Freezing Rain=Ледяной дождь
Hail=Град
Haze=Слабый туман
Heavy Rain=Сильный дождь
Heavy Snow=Сильный снег
Hot=Жарко
Hurricane=Ураган
Isolated Thunderstorms=Временами грозы
Light Rain=Небольшой дождь
Light Snow=Небольшой снег
Light Snow Showers=Сильный снегопад
Mixed Precipitation=Смешанные осадки
Mixed Rain and Hail=Дождь с градом
Mixed Rain and Sleet=Дождь с мокрым снегом
Mixed Rain and Snow=Дождь со снегом
Mostly Cloudy=Переменная облачность
Mostly Sunny=Преимуществеено солнечно
Overcast=Облачно
Partly Cloudy=Переменная облачность
PM Snow Showers=Ночью снегопад
Rain=Дождь
Scattered Showers=Местами грозы
Scattered Snow Showers=Местами снег
Severe Thunderstorms=Сильный дождь
Scattered Thunderstorms=Местами грозы
Sleet=Гололед
Smoke=Туман
Snow=Снег
Snow Flurries=Снегопад
Snow Showers=Снегопад
Snow Showers Early=Утром снегопад
Snow Showers Late=Позднее снег
Thunderstorms=Гроза
Tornado=Торнадо
Tropical Storm=Тропический шторм
Windy=Ветер
END
}

Проверка
[ "Местами грозы" = "$(wheather_dict 'Scattered Showers')" ] && echo works

Оффлайн Jursha

  • Автор темы
  • Участник
  • *
  • Сообщений: 230
    • Просмотр профиля
Re: Подскажите по bash.
« Ответ #8 : 29 Декабрь 2015, 16:42:36 »
Вот такая функция работает с /bin/sh (в Ubuntu это dash) без необходимости использовать bash версии 4.х
Я с Ubuntu ушел давно, так что не известно заработает ли у меня.
А скрипт писался для вот таких коньков:

shura1

  • Гость
Re: Подскажите по bash.
« Ответ #9 : 29 Декабрь 2015, 16:53:19 »
Я и привел эту функцию как-раз потому, что она должна работать на любых (реальных) unix-подобных системах. А коньки дело хорошее, конечно, но затягивающее. Дурман просто  ;)

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6009
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Подскажите по bash.
« Ответ #10 : 29 Декабрь 2015, 20:59:26 »
Jshura, Чем может быть вызвана необходимость не «использовать bash версии 4.х»? В любом случае массив работает быстрее, чем поиск. В крайнем случае используют 2 индексированных массива.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

shura1

  • Гость
Re: Подскажите по bash.
« Ответ #11 : 29 Декабрь 2015, 21:21:34 »
В Макоси баш по умолчанию 3.х, поскольку лицензия с 4-й изменилась, в андроиде бусибокс вообще без баша, все варианты BSD по умолчанию без баша.

А насчет скорости скорее всего да, но это отнюдь не очевидно. Вызов трех быстрых команд вполне может быть быстрее вызова одного монстра. Игрался вчера с типа релизом perl6 - запуск в 50(!!!) раз медленнее, чем perl5.

Пользователь решил продолжить мысль [time]29 Декабрь 2015, 22:27:59[/time]:
ПРОСТО МЫСЛИ. И да поиск grep на сотне строк в памяти и поиск баша в сотне значений ассоциативного массива - grep всяко быстрее, уверен абсолютно. Другое дело запуск grep, а потом открытие и считывание файла - это да, и за счет этого grep конечно будет медленней в сотни раз (в лучшем случае). Но при втором обращении уже будет кэш, и тут опять все неочевидно.
« Последнее редактирование: 29 Декабрь 2015, 21:30:54 от Jshura »

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6009
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Подскажите по bash.
« Ответ #12 : 29 Декабрь 2015, 22:06:48 »
ПРОСТО МЫСЛИ. И да поиск grep на сотне строк в памяти и поиск баша в сотне значений ассоциативного массива - grep всяко быстрее, уверен абсолютно.
Жалко разбивать Вашу "абсолютную" уверенность, однако при обращении к ассоциативному массиву нет поиска, обращение идет к области памяти по хэшу текстового поля. А grep кроме перебора текстовых строк тратит время на формирование патерна(поскольку Вы не использовали опцию -F)
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

shura1

  • Гость
Re: Подскажите по bash.
« Ответ #13 : 29 Декабрь 2015, 22:26:15 »
а) Поиск на массиве в несколько тысяч байт быстрее, чем вычисление хэш-функции и поиск в массиве динамических списков. Есть нюансы.
б) Известный парадокс в истории Unix - grep работала быстрее, чем fgrep. Grep очень оптимизирована и очень, ОЧЕНЬ быстра.
в) Тут вообще спорить не нужно. Взять вот отсюда готовые примеры, и замерить поиск 1000 значений, к примеру с помощью time. bash vs sh. У меня уже час ночи правда, но впереди еще куча праздников)

 

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