Установка переменной, значение которой зависит от другой переменной

У меня есть текстовый файл variables.txt, где я храню переменные

хост = / SRV / WWW / виртуальных доменов / хостинг

index = $ host /index.php

как вы видите, вторая переменная зависит от первой.

У меня также есть файл сценария для загрузки этих переменных

f=~/variables.txt for line in $(cat $f) do export $line done 

когда я запускаю файл сценария, моя первая переменная загружается, а вторая – нет:

 bash: $host/index.php: No such file or directory 

это связано с тем, что после загрузки первого хоста переменной он не запоминает его значение для установки второго индекса переменной.

Итак, как решить эту проблему? Я предполагаю, что должны быть некоторые дополнительные параметры или параметры, которые нужно передать, чтобы сделать это ( export ?) Помнить значение заданной переменной в цикле for .

4 Solutions collect form web for “Установка переменной, значение которой зависит от другой переменной”

Главное отметить, что вам, вероятно, не нужно экспортировать эти переменные; эта необходимость сохраняется только тогда, когда подпроцесс запрашивает свою унаследованную среду для переменной. Чаще всего люди экспортируют переменную, а затем делают что-то вроде somecmd "$myexportedvar" . Ваша оболочка расширяет $myexportedvar прежде чем somecmd когда-либо ее увидит.

Если вам действительно нужно экспортировать их для подпроцесса, чтобы вытащить из своей среды:

 while IFS= read -r line; do if [[ $line == *=* && $line != #* ]]; then IFS== read -r var val <<<"$line" printf -v "$var" '%s' "$val" export "$var" fi done < "$HOME/variables.txt" 

этот цикл проверяет, является ли строка назначением (kinda) и что первый символ не является хешем комментария. делает усилие немного более надежным, но едва ли. см. два варианта ниже, для более тщательного рассмотрения этого вопроса.

как в стороне, вышеуказанный цикл гарантирует, что вы не выполняете файл по мере его разбора. source оценивает каждую строку и фактически выполняет их все, поэтому мой цикл устранит эту «проблему» (если вы считаете это проблемой).

Кроме того, просто экспортируйте vars в исходный файл, затем введите source "$HOME/variables.txt" и работа уже выполнена.

вы можете просто использовать set -a; . "$HOME"/variables.txt; set +a set -a; . "$HOME"/variables.txt; set +a set -a; . "$HOME"/variables.txt; set +a . это позволяет избежать проблемы, когда исходный файл не состоит только из присвоений. описанная выше петля может привести к ложным срабатываниям. прочитайте help set чтобы понять, что она делает.

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

у вас есть более простой способ выполнить это.

 cat vars host=/srv/www/vhosts/hosting index=$host/index.php 

мой тестовый скрипт:

 #!/bin/bash . ./vars echo $host echo $index 

выполнение

 ./printvars.sh /srv/www/vhosts/hosting /srv/www/vhosts/hosting/index.php 

В основном. ./vars выполняет файлы и загружает переменные.

Мой совет также должен был бы указать файл и экспортировать все в файл «variables.txt». Современный текстовый редактор должен разрешать «редактирование столбца», или вы можете сценарировать модификацию.

Однако мне удалось ответить на ваш вопрос с помощью этого сценария:

 #!/bin/sh f=./variables.txt source ${f} for vname in $(cut -f1 -d'=' ${f}) do export ${vname} done 

Разница заключается в том, что я сначала запускаю файл variables.txt, поэтому все переменные определены в области действия этой оболочки с правильной интерпретацией. Только тогда я экспортирую все переменные файла, получив только имя переменной (vname).

На стороне примечания, вы должны защитить свои переменные с помощью $ {}.

Вы можете сделать это в два этапа:

 . ./vars while read line; do export $(printf "%s" "$line" | grep = | cut -d= -f 1) done < vars 

или только один

 while read line; do eval export "$line" done < vars 
  • dirname и basename против расширения параметров
  • Используйте sed для извлечения переменной из 1 файла и поместите ее в другую
  • Как использовать расширенное значение переменной оболочки в имени другой переменной?
  • Удалить определенное слово в переменной
  • Shell: как использовать 2 переменные с условием
  • Объем переменных при вызове функции из find
  • Bash: Объем переменных в цикле for с использованием тройника
  • Команда rm в скрипте bash не работает с переменной
  • Передать переменную с помощью EOF и использовать переменную хоста
  • Как установить переменную среды оболочки из файла autotools .am?
  • Развертывание Jenkins не передается переменной java
  • Linux и Unix - лучшая ОС в мире.