Как передать переменную без оценки в сценарий оболочки, и чтобы сценарий оценил ее после поиска другого сценария? - PullRequest
0 голосов
/ 17 октября 2019

У меня есть сценарий, который использует второй сценарий, и мне нужно сделать следующее:

  • Я хочу передать имя переменной первому сценарию, например: sh firstScript.sh variable =$ variableName
  • Первый сценарий будет затем источником второго сценария, который содержит значение variableName
  • Затем я собираюсь напечатать вычисленную переменную

Iзнаю, что я могу сделать что-то вроде \ $ variableName для передачи имени переменной, но я не могу понять, как получить первый сценарий, чтобы затем вычислить переменную, используя экспортированные переменные из второго сценария. Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Вот что я сделал в итоге:

Я передаю всю строку с переменной, встроенной в середину строки, примерно так:

sh firstScript.sh -message = "Это сообщение \ $ {variableName}"

В первом скрипте я делаю следующие шаги:

  1. Извлечение всей строки в массив
  2. Извлечение встроенных переменных
  3. Оценка встроенных переменных по исходному сценарию
  4. Заменить строку, чтобы поместить значение в исходную строку

Когда я закончил, это выглядело так:

IFS=';' args=(${@//--/;}); unset IFS

source secondScript.sh

case ${arg^^} in
  MESSAGE=*)
    message="${arg#*=}"
    messageVars=$(echo ${message} | grep -o "\${\w*}")

    for messageVar in ${messageVars[*]}; do
      messageVar=${messageVar#*\{}
      messageVar=${messageVar%\}*}
      messageVarVal=${!messageVar}

      echo "messageVar: ${messageVar}"
      echo "messageVarVal: ${messageVarVal}"
      message=${message//"\${${messageVar}}"/"${messageVarVal}"}
    done

    echo "Message: ${message}"
  ;;
esac
0 голосов
/ 17 октября 2019

Я надеюсь, что это то, что вы хотите:

firstScript.sh

varname="$1"
if [[ -z $varname ]]; then
    echo "usage: $0 varname"
    exit
fi
source ./secondScript.sh

declare -n ref="$varname"
echo "varname=$varname value=$ref"

secondScript.sh

foo=2

Затем выполните сценарий с помощью:

./firstScript.sh foo

Вывод:

varname=foo value=2

Опция -n для declare создает ссылку на другую переменную. Версия bash должна быть 4.3 или более поздней, чтобы пользоваться этой функциональностью.

[Альтернатива]

Вы также можете написать firstScript.sh как:

firstScript.sh

varname="$1"
if [[ -z $varname ]]; then
    echo "usage: $0 varname"
    exit
fi
source ./secondScript.sh

echo "varname=$varname value=${!varname}"

, который даст тот же результат.

Обозначение ${!varname} называется indirect expansion, в котором varname раскрывается как имя переменной.
Оно было введено начиная с bash2.

Надеюсь, это поможет.

...