Отправляет email-рассылки с помощью сервиса Sendsay

Вопрос по оболочке: обращение к массиву по имени значения переменной.

Здравствуйте,

скажите, пожалуйста, как можно обратиться к i-тому элементу массива, имя которого
содержит
переменная $1.

Т.е.: есть массивы a, b, c
есть переменная $1, имеющая значение, b.
мне н/о обратиться к $1[$i] - в данном случае, это будет ${b[$i]}.

Спасибо за Ваши время и силы.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 36144; Возраст листа: 2143; Участников: 1382
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/869699

Ответить   Strong and Humble Sat, 6 Jun 2009 23:44:09 +0700 (#869699)

 

Ответы:

On Sat, 6 Jun 2009 23:44:09 +0700
Strong and Humble <strong.humb***@g*****.com> wrote:

Не пользовался масивами, и в общем не совсем понял вопрос но IMHO
если написать такой скрипт и назвать его MyScript

#!/bin/bash
echo $1

то при исполнении его
$ sh ./MyScript MyVar YouVar OueVar

на екран будет выиедена переменная плученная из командной строки МуVar
$0 - название скрипта
$2 - YouVar
$3 - OueVar

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 36145; Возраст листа: 2144; Участников: 1382
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/870041

Ответить   Sun, 7 Jun 2009 17:09:43 +0300 (#870041)

 

В Sat, 6 Jun 2009 23:44:09 +0700
Strong and Humble <strong.humb***@g*****.com> пишет:

eval echo \${$1[$i]}

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 36146; Возраст листа: 2145; Участников: 1382
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/870128

В Sat, 6 Jun 2009 23:44:09 +0700
Strong and Humble <strong.humb***@g*****.com> пишет:

eval echo \${$1[$i]}

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 36147; Возраст листа: 2145; Участников: 1382
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/870129

Спасибо за Ваш ответ, Геннадий Владимирович:

- То, что нужно, только не могу понять: как выдаваемое значение использовать,
например, в конструкции if т.е. что-то типа:

[ $(eval echo \${$1[$i]}) ] && echo '1' || echo '0'

?

Почитал док-цию по eval - мало что понял применительно к моему случаю...

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 36150; Возраст листа: 2147; Участников: 1382
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/871185

Ответить   Strong and Humble Wed, 10 Jun 2009 18:10:16 +0700 (#871185)

 

Может:
if [ -z [ $(eval echo \${$1[$i]}) ] && echo '1' || echo '0' ]; then
echo 0
else
echo 1
fi

10 июня 2009 г. 14:10 пользователь Strong and Humble <
strong.humb***@g*****.com> написал:

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 36151; Возраст листа: 2147; Участников: 1382
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/871218

Ответить   Wed, 10 Jun 2009 16:10:42 +0300 (#871218)

 

10 июня 2009 г. 17:10 пользователь Константин Поветкин <povetkin***@g*****.com

Что это? Работать не будет - вы перестарались с проверками

10 июня 2009 г. 14:10 пользователь Strong and Humble <

Как раз для вас - самому себе строку вывести и ещё раз разобрать и
исполнить

Только если вам нужно подобное - есть для этого perl и python (lua для
аскетов). Да - в них нужно разбираться. Зато результат этого стоит

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 36152; Возраст листа: 2147; Участников: 1382
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/871237

Ответить   Wed, 10 Jun 2009 17:53:41 +0400 (#871237)

 

Спасибо за Ваш ответ, Serguey:

Да, я знаю как это сделать на перле, но мне н/о было именно в оболочке.

Геннадий Владимирович здорово растолковал как работает eval - не то, что в
рук-ве.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 36169; Возраст листа: 2157; Участников: 1384
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/875285

Ответить   Strong and Humble Sat, 20 Jun 2009 16:13:24 +0700 (#875285)

 

Спасибо за Ваш ответ, Константин:

Это выдаёт ошибку:

[: [: binary operator expected

Тогда я попробовал так:

a=b
b=(0 0 1 0 0 1 1 0)
i=1
if [ -z $(eval echo \${$a[$i]}) ]
then
echo Zero
else
echo One
fi

Однако, не срабатывает, всегда One возвращает.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 36169; Возраст листа: 2157; Участников: 1384
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/875284

Ответить   Strong and Humble Sat, 20 Jun 2009 16:04:47 +0700 (#875284)

 

В Wed, 10 Jun 2009 18:10:16 +0700
Strong and Humble <strong.humb***@g*****.com> пишет:

Ну например так:
eval x=\${$1[$i]}
if [ "$x" == "<знач>" ] ; then
<что-то>
fi

Всё просто для аргументлв после eval оболочка выполняет все подстановки (слеш
перед первым $ как раз и нужен чтоб оболочка восприняла его просто как символ)
и
результат передаётся eval которая полученную строку снова выполняет в оболочке
и
возвращает результат выполнения команды. То есть на первом проходе $1 меняктся
на
имя массива, а $i на индекс и получившаяся команда присваивания
переменной значения элемента массива передаётся eval которая и выполнит команду
в оболочке. Как результат в переменной значение элемента ну дальше можно и if
использовать.

Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 36153; Возраст листа: 2147; Участников: 1382
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/871306

Спасибо за Ваш ответ, Геннадий Владимирович:

В яблочко! Спасибо!

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 36171; Возраст листа: 2157; Участников: 1384
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/875286

Ответить   Strong and Humble Sat, 20 Jun 2009 16:12:44 +0700 (#875286)