2

Мне нужно динамически создать имя переменной следующим образом (упрощенный пример):

#!/bin/sh

IDX=1
SERIES1="a b c d e f g"
SERIES2="h i j k l m n"

# How to get this value contains $SERIES1 or $SERIES2
# depending on the value of $IDX
CURRENT=${SERIES\${IDX}} # doesn't work, just an example

Если IDX=1 я бы ожидал

echo $CURRENT

для отображения

a b c d e f g

и если IDX=2 для отображения

h i j k l m n

Мне нужно будет использовать его в цикле для неопределенного числа СЕРИЙ, поступающих из другого скрипта.

РЕДАКТИРОВАТЬ В настоящее время используется sh качестве оболочки, но при необходимости я могу использовать другую (даже если это означает, что мне может понадобиться преобразовать несколько вещей, но это нормально)

У меня вопрос: как назначить желаемую серию для CURRENT

Что я пробовал? Пример выше (это не работает) и другие варианты, такие как:

CURRENT=$${SERIES$${IDX}}
CURRENT=${SERIES${IDX}}

EDIT2

Я на пути к чему-то

eval echo $`echo "SERIES$IDX"`

Это отображает правильную серию. Однако я не могу найти способ назначить его на CURRENT:

CURRENT=eval echo $`echo "SERIES$IDX"`

Но я думаю, еще копать, и я найду что-нибудь. Любая помощь приветствуется

EDIT3

Хорошо, я нашел это:

eval "CURRENT=\$SERIES$IDX"
echo $CURRENT

отображать то, что я ожидаю, поэтому CURRENT имеет правильный контент.

2 ответа2

3

Благодаря этому сайту (и, вероятно, другие имеют аналогичный ответ ...):

#!/bin/sh

IDX=1
SERIES1="a b c d e f g"
SERIES2="h i j k l m n"

eval "CURRENT=\$SERIES$IDX"

Теперь CURRENT содержит содержимое SERIES1 . Если я изменю IDX на 2, я получу контент SERIES2 .

1

Это не совсем то, что вы хотите, но если вы используете bash вместо sh вы можете использовать массивы:

IDX=1
SERIES[1]="a b c d e f g"
SERIES[2]="h i j k l m n"

CURRENT=${SERIES[$IDX]}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .