Как я могу использовать расширенное значение переменной shell в имени другой переменной?

Вы можете использовать мой скрипт, используя mv.

mkdir downloaded

mv downloaded.zip downloaded && cd downloaded

unzip downloaded.zip && cd

Вы создадите папку (downloaded) и распакуете его в созданную папку.

2
27.08.2017, 01:24
2 ответа

Bash поддерживает переменную косвенность:

#!/bin/bash
MARCOMIN=1
MARCOMAX=3
ENZOMIN=1
ENZOMAX=3
GIOVANNIMIN=1
GIOVANNIMAX=3
VALUEMARCO=12
VALUEGIOVANNI=4
VALUEENZO=12

for i in MARCO ENZO GIOVANNI; do
    for j in MIN MAX VALUE; do
        varname="${i}${j}"
        # For VALUE we need reverse order of i and j
        [[ $j = VALUE ]] && varname="${j}${i}"

        printf "%d is %s's %s\n" "${!varname}" "$i" "$j"
    done
done

exit 0

Я сделал немного больше с внутренним циклом и использовал printfвместо echo, но основная идея заключается в том, что по имени переменной foo, хранящемуся в другой переменной bar, вы можете получить значение $foo, выполнив ${!bar}.

Подробнее:https://stackoverflow.com/questions/8515411/what-is-indirect-expansion-what-does-var-mean

3
27.01.2020, 22:09

Для использования раскрытия переменной внутри имени другой переменной традиционно используется встроенная команда оболочки eval. Это часто приводит к синдрому наклонной зубочистки (множество обратных косых черт и двойных переходов), который предполагает, что может быть «лучший» способ выполнить то, что вы хотите сделать. Существуют также проблемы безопасности, связанные с использованием встроенной команды eval.

В любом случае, это один из способов добиться желаемого:

# ...
    eval echo \$${i}MIN is \$i\\\'s MIN
    eval echo \$${i}MAX is \$i\\\'s MAX
    eval echo \$VALUE${i} is \$i\\\'s VALUE
# ...
-1
27.01.2020, 22:09

Теги

Похожие вопросы