У меня есть файл конфигурации с этим содержанием:

config_scrm.sh

CDT_TRIGGER='69'
SR_TRIGGER='165'

В основной сценарий мне нужно вставить содержимое CDT_TRIGGER (который 69) в переменную с именем TRIGGER. Единственное, что я должен знать, что я должен получить точное содержимое переменной, это другая (локальная) переменная с именем ELM = 'CDT'.

Итак, в основном скрипте я выполняю:

main.sh

#!/bin/bash

source config_scrm.sh

(some calculations to obtain the value of variable ELM)

ELM='CDT'

Мне нужно, чтобы ТРИГГЕР был 69.

Если ELM = 'SR', мне нужно, чтобы TRIGGER был 165. И так далее, есть гораздо больше значений, чем показано в этом отрывке.


Что не работает:

MYSTRING='_TRIGGER'
TRIGGER=${$ELM$MYSTRING}

или же

TRIGGER=`echo "$ELM$MYSTRING"`

или же

TRIGGER=`$(echo "$ELM$MYSTRING")`

1 ответ1

0

Хотя $ELM$MYSTRING расширяется до нужного вам имени, TRIGGER=${$ELM$MYSTRING} не работает, потому что здесь необходимо, чтобы раскрытие параметра происходило дважды: сначала "внутренние" переменные, затем "внешняя".

Ваши попытки с подстановкой команд имели бы немного больше смысла, если бы вы на самом деле использовали "внешний" $ чтобы попытаться вызвать расширение дополнительного параметра; но даже тогда они потерпят неудачу по той же причине, что и выше.

Ну, вы можете иметь расширение параметров в два отдельных шага. Вам нужно eval для этого:

eval 'TRIGGER=$'"$ELM$MYSTRING"

Сначала переменные внутри "" раскрываются нормально, все внутри '' остается нетронутым. Затем eval выполняет дополнительный анализ результирующей строки, которая теперь точно равна TRIGGER=$CDT_TRIGGER . Решение портативное, хотя вы должны быть осторожны с eval . Посмотрите, почему в Bash следует избегать eval , и что я должен использовать вместо этого?

В Bash есть более безопасный (но не переносимый) способ сделать то, что вы хотите:

wholename=$ELM$MYSTRING    # we need this in a single variable
TRIGGER=${!wholename}

Примечание: учитывайте имена переменных в нижнем регистре.

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