Будуйте змінну оболонки динамічно


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

Мені потрібно буде використовувати його в циклі для невизначеної кількості SERIES, що надходять з іншого сценарію.

EDIT Наразі використовується 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має правильний зміст.

Відповіді:


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]}

Дякую. Я вважаю, що це останній варіант, але я знайшов вихідsh
JScoobyCed
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.