Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > Linux для начинающих

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.01.2015, 06:07   #1
SergeS3
Banned
 
Регистрация: 05.01.2015
Сообщений: 18
Вес репутации: 0
SergeS3 is an unknown quantity at this point
По умолчанию Массивы в sh в минироутерах на openwrt

А что, в минироутерах (mr3020, gl-inet, и тд) на opwenwrt в ихних shell-скриптах (или как там это правильно называть? sh-файлы) массивы (arrays) отсутствуют как класс?

Пробовал куча разных вариантов синтаксиса из инета - ни один не пошел, зато нашел какую-то неуверенную инфу, что вроде BusyBox (на нем шелл в этих роутерах реализован) не поддерживает arrays.

Кто то может что-то сказать по этому поводу?

p.s. Речь об обычных индексных массивах, не ассоциативных, естественно.
SergeS3 вне форума   Ответить с цитированием
Старый 12.01.2015, 11:25   #2
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 43
Сообщений: 573
Вес репутации: 599
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию Re: Массивы в sh в минироутерах на openwrt

Насколько я знаю, поддержки массивов нет, но в некоторых случаях можно обойтись без них:

Код:
# Расчёт CRC16.
crc () {

    # Преобразуем выражение в строку.
    str="$1"
    
    # Расчитываем количество циклов.
    cnt=$((${#1}-2))
    
    # Начальное значение.
    crc=0xFFFF

    for i in `seq 0 2 $cnt`; do

        crc=$(( crc ^ 0x${str:$i:2} ))

        for j in `seq 0 7`; do

            c=$(( crc >> 1 ))

            if [ $(( crc & 1 )) = 1 ]; then                 

                let 'c ^= 0xA001'
            fi

            crc=$c

        done

    done
    
    # Меняем местами байты.
    c=$(( crc & 0xFF ))
    c=$(( c << 8 ))
    crc=$(( crc >> 8 ))
    crc=$(( crc + c ))

    # Переводим в hex вид.
    printf "%04X" $crc
}
__________________
Россия навсегда!
uni вне форума   Ответить с цитированием
Старый 13.01.2015, 02:24   #3
SergeS
Senior Member
 
Регистрация: 21.12.2014
Сообщений: 164
Вес репутации: 0
SergeS is an unknown quantity at this point
По умолчанию Re: Массивы в sh в минироутерах на openwrt

Цитата:
Сообщение от uni Посмотреть сообщение
Насколько я знаю, поддержки массивов нет, но в некоторых случаях можно обойтись без них:
Не, ну понятно, что в некоторых случаях можно, но твой пример мне совсем не подходит...
мне надо произвольный доступ по индексу к строковому массиву.
Мне даже где-то попадался рабочий пример "типа строкового массива", но с последовательным доступом по инкрементному индексу - может быть этот пример еще как то удастся приспособить...

Ладно, спасибо, будем думать...
п.с. странно, циклы есть, а массивов нету :-)

Последний раз редактировалось SergeS; 13.01.2015 в 02:30.
SergeS вне форума   Ответить с цитированием
Старый 13.01.2015, 07:20   #4
Sega-san
Junior Member
 
Регистрация: 29.07.2013
Сообщений: 2
Вес репутации: 0
Sega-san is an unknown quantity at this point
По умолчанию Re: Массивы в sh в минироутерах на openwrt

Мне помогла первая же ссылка в гугле:
Код:
#!/bin/ash

ARRAY=" \
http://openwrt.org \
http://wiki.openwrt.org \
"
i=1

for j in $ARRAY
do
        echo $i: $j
        i=`expr $i + 1`
done
Sega-san вне форума   Ответить с цитированием
Старый 13.01.2015, 14:15   #5
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 43
Сообщений: 573
Вес репутации: 599
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию Re: Массивы в sh в минироутерах на openwrt

Это не массив строк, а строка с пробелами между словами. В моём примере есть такой же цикл с перебором элементов последовательности `seq 0 7`, где for перебирает элементы последовательности, разделённые пробелами (возможно и другими разделителями).

Идеология unix построена вокруг небольших специализированных утилит, которые обрабатывают данные последовательно, элемент за элементом. Самый простой интерпретатор shell вот это и делает. Он может работать с последовательностями , а ваша задача представить данные так, чтобы они представляли из себя последовательный одномерный набор объектов.

Набор строк - это уже более сложный объект, чем просто строка. Я использую json, чтобы работать с массивами.
__________________
Россия навсегда!
uni вне форума   Ответить с цитированием
Старый 14.01.2015, 08:37   #6
SergeS
Senior Member
 
Регистрация: 21.12.2014
Сообщений: 164
Вес репутации: 0
SergeS is an unknown quantity at this point
По умолчанию Re: Массивы в sh в минироутерах на openwrt

Цитата:
Сообщение от Sega-san Посмотреть сообщение
Мне помогла первая же ссылка в гугле:
Код:
#!/bin/ash

ARRAY=" \
http://openwrt.org \
http://wiki.openwrt.org \
"
i=1

for j in $ARRAY
do
        echo $i: $j
        i=`expr $i + 1`
done
Это именно тот конкретный пример ("типа строкового массива", но с последовательным доступом по инкрементному индексу) о котором я говорил чуть выше, это не массив, хотя и используется loop для доступа к последовательным элементам строки.
SergeS вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 00:20. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика