Я пытаюсь выяснить, как заменить совпадения регулярного выражения в файле значением переменной среды, называемой подстрокой этой совпадающей строки. Каждая подходящая строка также имеет значение по умолчанию, разделенное двоеточием. Я имею в виду, что если у меня есть файл myFile.properties, который содержит:
varWithDefault=${envVar1:default1}
varSetNoDefault=${envVar2}
varEmptyValue=${emptyEnvVar}
varEmptyValueWithDefault=${emptyEnvVar:3}
varNotSetWithDefault=${notSetEnvVar:I have : a colon}
# required but no match will prob be an error message
varNotSetNoDefault=${notSetEnvVar}
И я установил следующие переменные окружения:
export envVar1=value1
export envVar2=value2
export emptyEnvVar=""
, тогда файл должен обновиться так:
varWithDefault=value1
varSetNoDefault=value2
varEmptyValue=
varEmptyValueWithDefault=
varNotSetWithDefault=I have : a colon
# required but no match will prob be an error message
varNotSetNoDefault=${notSetEnvVar}
У меня есть кое-что, что по большей части работает ... но не обрабатывает, когда в среде задана пустая строка, и не обрабатывает значения по умолчанию.
# get any variables we would like to replace in the myFile.properties file
# after the colon I say "anything except for a closing bracket" so that it will allow for colons in the value
varStrings=$( grep -Po '\${([_a-zA-Z][_a-zA-Z0-9]*)(:[^}]*)*}' myFile.properties )
# loop through the variables found and replace them with the value of the corresponding environment variable
# varString is a value that looks like: "${my_variable:my_default}"
for varString in ${varStrings[@]} ; do
# ideally grab these values from the matched regex, but I can't seem to figure out how to do that
# propName would be: "my_variable"
# defaultValue would be: "my_default"
propName=$varString[0]
defaultValue=$varString[1]
# this technically gets the values, but I would also need to remove the "${}"
propName="$( cut -d ':' -f 1- <<< "$varString" )"
defaultValue="$( cut -d ':' -f 2- <<< "$varString" )"
# $varString will be a String in the format '${my_variable:my_default}' so I need to strip the default chunk from it before doing this
# but... to get the environment variable value if there was no default:
envValue=`eval echo $varString`
# if there is a matching environment variable, do the replacement; otherwise, spit out a warning
# the -z will also fail the if check if the value is an empty string, which I don't want. I only want it to go to the else clause if it was not set. Not sure how to do that.
if [ ! -z "$envValue" ]; then
echo "Replacing $varString with environment variable value '$envValue'"
sed -i "s|$varString|$envValue|g" myFile.properties
else
# set the default value
if [[ noDefaultValueGiven ]] ; then
echo "Warning: No environment variable defined for $envVarName. String not replaced."
else
echo "Warning: No environment variable '$envVarName' defined. Using default value '$defaultValue'."
sed -i "s|$varString|$defaultValue|g" myFile.properties
fi
fi
done
У меня есть две большие проблемы:
1. Как l oop через каждое совпадение с регулярным выражением и иметь доступ к обеим группам регулярных выражений (разделы, заключенные в круглые скобки)
2. Как проверить если существует переменная окружения, основанная на строковом представлении указанной переменной (т. е. проверяется, установлено ли "${my_variable}"
, а не только пусто)
Кто-нибудь знает, как это сделать? Я привык к SpringBoot, делающему это для меня.