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


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

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

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

Оффлайн Jursha

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

Оффлайн alsoijw

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

Оффлайн Jursha

  • Автор темы
  • Участник
  • *
  • Сообщений: 237
    • Просмотр профиля
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

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

Оффлайн Jursha

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

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Подскажите по bash.
« Ответ #5 : 29 Декабря 2015, 14:31:21 »
А вообще что это за безумие с if
Код: (bash) [Выделить]
declare -A wdict
wdict=(
[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]="Ветер"
)
echo "$cond = ${wdict[cond]}"
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Jursha

  • Автор темы
  • Участник
  • *
  • Сообщений: 237
    • Просмотр профиля
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

  • Автор темы
  • Участник
  • *
  • Сообщений: 237
    • Просмотр профиля
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

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • 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

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • 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.056 секунд. Запросов: 23.