Имя переменной BASH, содержащее номер, проблема

Имя переменной BASH, содержащее номер, проблема

Возникли некоторые проблемы при использовании переменной с числом.

Это работает;

sourceid_2="blah"
echo $sourceid_2

Но это не работает;

sourceid_2="blah"
i=2
echo $sourceid_$i

Есть идеи, как это исправить? Я пробовал без подчеркивания... но это не помогло.

Моя конечная цель — сделать что-то с переменной в цикле for i in {2..7}.. вот так;

for i in {2..7}
do
echo $sourceid_$i
done

решение1

echo $sourceid_$iрасширяет две отдельные переменные: $sourceid_и $i. Самый простой способ сделать то, что вы пытаетесь сделать, — это использовать косвенную ссылку:

sourceid_2="blah"
i=2
var=sourceid_$i
echo "${!var}"

Но как отметил @dave_thompson_085, массивы обычно являются лучшим способом сделать что-то подобное:

declare -a sourceid
sourceid[2]="blah"
i=2
echo "${sourceid[i]}"

Обратите внимание, что массивы — это расширение bash, и они недоступны в более простых оболочках.

решение2

Ваша проблема не в имени, содержащем цифру, что прекрасно работает, а в имени, содержащемпеременная. Вы можете использовать eval(что трудно сделать правильно и легко испортить) или косвенное обращение, как x=source_$i; echo "${!x}"в этом случае это дубликатмассив bash с переменной в именикоторые SX уже автоматически поместил в соответствующий список, чтобы вы могли их просмотреть.

Но если вы хотите, чтобы несколько связанных переменных были доступны по номеру, еще лучше использовать массив. Именно для этого и предназначены массивы, что делает их более удобными и безопасными. Чтобы узнать о массивах в bash, см. раздел руководства bash о массивах в вашей системе илив сети здесь

Связанный контент