Решено: Как преобразить переменную со строки? (/bin/sh)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
rooty
Сообщения: 83
ОС: laptop: openSuSE 12.1

Решено: Как преобразить переменную со строки?

Сообщение rooty »

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

Занялся написанием скрипта для бекапов веб-сайтов т.к. нечего не нашел подходящего.

Есть у меня примерно такие переменные:

Код: Выделить всё

PATH_WEBSITE_ROOT_1="/var/www/mydomain.su"
PATH_WEBSITE_EXCLUDE_1="/var/www/mydomain.su/cache"
PATH_WEBSITE_ROOT_2="/var/www/blah.su"
PATH_WEBSITE_EXCLUDE_2="/var/www/blah.su/incoming"


Не получается построить перебор...

т.е. хочу сделать что-то на подобии такого:

Код: Выделить всё

i=1
while :
 do

  if [ -z "${PATH_WEBSITE_ROOT_${i}}" ]; then break; fi

  ..................

  i=$(($i+1))

done


Подскажите, пожалуйста, как в /bin/sh можно сделать вот примерно такое ${PATH_WEBSITE_ROOT_${i}} ?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Решено: Как преобразить переменную со строки?

Сообщение /dev/random »

${!имя} обращается к переменной, имя которой находится в указанной переменной.
${!!имя} обращается к переменной, имя которой находится в переменной, имя которой находится в указанной переменной.
И так далее.
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Решено: Как преобразить переменную со строки?

Сообщение ZyX »

Судя по наличии $(()) в коде, это всё-таки /bin/bash, а не /bin/sh. Тогда почему бы не использовать массивы самого bash’а?
Спасибо сказали:
Аватара пользователя
rooty
Сообщения: 83
ОС: laptop: openSuSE 12.1

Re: Решено: Как преобразить переменную со строки?

Сообщение rooty »

ZyX писал(а):
15.11.2010 07:44
Судя по наличии $(()) в коде, это всё-таки /bin/bash, а не /bin/sh. Тогда почему бы не использовать массивы самого bash’а?

Нет, это именно /bin/sh, и все скрипты я пытаюсь писать именно в Bourne Shell . Дело в том, что во FreeBSD по дефолту баша нет. А чтоб его поставить, нужно время... к тому же он за собой еще несколько зависимо тянет...
Внутри $(()), Bourne Shell ожидает увидеть арифметическую операцию.

/dev/random писал(а):
15.11.2010 07:01
${!имя} обращается к переменной, имя которой находится в указанной переменной.
${!!имя} обращается к переменной, имя которой находится в переменной, имя которой находится в указанной переменной.
И так далее.

Спасибо огромное за подсказку, но боюсь я вас не понял... перепробовал все возможные варианты с этими знаками восклицания и в ответ получаю: Bad substitution. Можете, пожалуйста, навести пример в случае с "${PATH_WEBSITE_ROOT_${i}}" ?
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Решено: Как преобразить переменную со строки?

Сообщение sgfault »

/dev/random писал(а):
15.11.2010 07:01
${!имя} обращается к переменной, имя которой находится в указанной переменной.
${!!имя} обращается к переменной, имя которой находится в переменной, имя которой находится в указанной переменной.
И так далее.

ээ.. если я не ошибаюсь, больше одного '!' в баше никогда нельзя было использовать (или я так сильно отстал от жизни?).

rooty писал(а):
15.11.2010 18:45
Спасибо огромное за подсказку, но боюсь я вас не понял... перепробовал все возможные варианты с этими знаками восклицания и в ответ получаю: Bad substitution. Можете, пожалуйста, навести пример в случае с "${PATH_WEBSITE_ROOT_${i}}" ?


В вашем случае, вообще нету "косвенной ссылки". Как вам уже сказал /dev/random, чтобы использовать '!', в исходной переменной должно содержаться _имя_ другой переменной. Т.е в вашем случае, попробуйте так

Код: Выделить всё

t="PATH_WEBSITE_ROOT_${i}"
[ -z "${!t}" ]


Чтобы сделать произвольный уровень "разыменования" (косвенных ссылок) или если вы не хотите использовать другую переменную, как в примере выше, можно использовать eval.

Код: Выделить всё

[ -z "$(eval "echo \"\${PATH_WEBSITE_ROOT_${i}}\"")" ]


(что из этих двух примеров будет работать под sh точно не знаю - попробуйте)

А, вообще, Shell-Parameter-Expansion (это про '!') и Bourne-Shell-Builtins (это про eval)
Спасибо сказали:
Аватара пользователя
rooty
Сообщения: 83
ОС: laptop: openSuSE 12.1

Re: Решено: Как преобразить переменную со строки?

Сообщение rooty »

Код: Выделить всё

#!/bin/sh
PATH_WEBSITE_ROOT_2="/var/www/fuuu.su"
PATH_WEBSITE_EXCLUDE_2=""

i=1
i=$(($i+1))

t="PATH_WEBSITE_ROOT_${i}"
echo "${!t}"


exit 0

Код: Выделить всё

[root@dream]:/storage/backups# ./www.sh
./www.sh: ${!t}: Bad substitution
Exit 2


eval отработал... почему-то о нем и не подумал... спасибо, буду юзать его
Спасибо сказали:
Аватара пользователя
rooty
Сообщения: 83
ОС: laptop: openSuSE 12.1

Re: Решено: Как преобразить переменную со строки?

Сообщение rooty »

Хех... для информации

только что проверил кусок кода

Код: Выделить всё

#!/bin/sh
PATH_WEBSITE_ROOT_2="/var/www/fuuu.su"
PATH_WEBSITE_EXCLUDE_2=""

i=1
i=$(($i+1))

t="PATH_WEBSITE_ROOT_${i}"
echo "${!t}"


exit 0

на своем OpenSuSE и он замечательно отработал...

на FreeBSD видимо родной Bourne Shell не умеет такого делать или делает как-то по другому...

В любом случае задача решена.. еще раз спасибо всем.
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Решено: Как преобразить переменную со строки?

Сообщение sgfault »

rooty писал(а):
15.11.2010 19:39

Код: Выделить всё

i=$(($i+1))

Тоже просто для информации:
Обычно, '$' в $(()) не обязательно, т.е можно писать просто

Код: Выделить всё

i=$((i + 1))

или вообще с '++'

В любом случае, чем меньше значков, тем проще читать -)

(насчет sh не уверен - попробуйте)
Спасибо сказали:
Аватара пользователя
rooty
Сообщения: 83
ОС: laptop: openSuSE 12.1

Re: Решено: Как преобразить переменную со строки?

Сообщение rooty »

sgfault писал(а):
15.11.2010 19:48
rooty писал(а):
15.11.2010 19:39

Код: Выделить всё

i=$(($i+1))

Тоже просто для информации:
Обычно, '$' в $(()) не обязательно, т.е можно писать просто

Код: Выделить всё

i=$((i + 1))

или вообще с '++'

В любом случае, чем меньше значков, тем проще читать -)

(насчет sh не уверен - попробуйте)

спасибо за подсказку... да, согласен, красивее выглядит..

Код: Выделить всё

i=$((i + 1))

работает


не работает (arithmetic expression: syntax error: "i++")

Спасибо сказали: