LINUX.ORG.RU

Подстановка в bash

 


1

2
COOL_URL=kernel.org
SUXX_URL=microsoft.com
for name in COOL SUXX
do
  VAR=${name}_URL
  echo ${!VAR}
done

В таком виде оно работает. Но по ряду причин надо избавиться от промежуточной переменной и выводить строки одной командой. Как бы это сделать?

Deleted

eval echo \$${name}_URL работает, но как-то это некрасиво.

Deleted ()

это просто супер =)

COOL_URL=kernel.org
SUXX_URL=microsoft.com
for name in COOL SUXX
do
  VAR=${name}_URL
  echo ${!VAR}
done
вопрос, for тебе точно нужен ? т.е в оригинальном коде переменных больше ?

dada ★★★★★ ()

не первый раз вижу такой пердолинг и ни разу не видел объяснения зачем. поциенты пытаются изобразить ассоцианиввный массив? пожалуйста:

declare -A urls
urls[COOL_URL]=kernel.org
urls[SUXX_URL]=microsoft.com

for i in ${urls[@]};do
  echo $i;done

anonymous ()
Ответ на: комментарий от Black_Shadow

$ echo {$COOL,$SUXX}_URL

Занятно, но неприменимо, к сожалению. Суть™ в том, что есть скрипт в котором имеются еще и COOL_BEER, COOL_BLACKJACK и COOL_HOOKERS и соответственно их SUXX вариация, причем над всеми совершаются однотипные действия. Хочется это упорядочить.

Deleted ()
Ответ на: комментарий от Deleted

тут бы ассоциативный массив задействовать.

bl ★★★ ()
Ответ на: комментарий от Deleted

Я думал, ты как раз от for пытался избавиться. Тогда так:

COOL_URL=kernel.org
SUXX_URL=microsoft.com
for name in COOL SUXX
do
  VAR=${name}_URL
  echo -n "${!VAR} "
done
echo

Black_Shadow ★★★★★ ()
Ответ на: комментарий от anonymous

Маленький дисклаймер: на старых башах может не работать.

post-factum ★★★★★ ()
Ответ на: комментарий от Black_Shadow

Эээ, а чем это отличается от варианта из первого поста кроме вывода в одну строку? Я пытаюсь избавиться не от фора. Я хочу найти подстановку которую можно использовать в разных переменных без многострочных приготовлений.

Deleted ()
Ответ на: комментарий от Deleted

Да, невнимательно читал. Что ничего не меняет - слово «URL» можно брать откуда угодно; например:

my_strange_echo() {
for name in {COOL,SUXX}_$1 ; do
echo ${!name}
done

DonkeyHot ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.