TL; DR Добавьте явное =
в конец каждой строки ввода, затем удалите его из результирующего значения перед его использованием.
Почему это работает так, как работает
См. https://mywiki.wooledge.org/BashPitfalls#pf47. Короче говоря, =
в IFS не рассматривается как поле разделитель , а как поле терминатор , согласно определению POSIX разделения поля .
Когда вы пишете
IFS== read -r key value <<< "foo=var="
, вход сначала разбивается на два поля, "foo" и "var" (не "foo", "var", а также ""). Переменных ровно столько же, сколько и полей, поэтому вы просто получите key = foo и value = var
Если у вас есть
IFS== read -r key value <<< "foo=var=="
, теперь есть три поля: "foo", "var" и "". Поскольку существует только две переменные, тогда key = foo и присваивается значение:
- значение «var», как обычно
- Разделитель «=» сразу после «var» на входе
- Поле "" с входа
- Разделитель "=" после "" на входе
См. спецификацию POSIX для read
для получения подробной информации о каждой переменной read
присваивается значение после разделения поля на входе.
Таким образом, никогда не бывает завершающего нулевого поля, которое получается в результате разделения поля input, только конечный разделитель , который добавляется обратно к конечной переменной.
Как сохранить ввод
Чтобы обойти это, добавьте явный = на ваш вход, а затем удалите его из результирующего значения.
$ for input in "foo=bar" "foo=bar=" "foo=bar=="; do
> IFS== read -r name value <<< "$input="
> echo "${value%=}"
> done
bar
bar=
bar==
В вашем случае это означает использование чего-то
while IFS='=' read -r key value
do
value=${value%=}
...
done < < (sed 's/$/=/' application.properties)
Или, как предложено сначала Иваном , используйте операторы расширения параметров, чтобы разделить ввод вместо того, чтобы read
do it.
while read -r input; do
key=${input%%=*}
value=${input#*=}
...
done < application.properties
В любом случае, имейте в виду, что в качестве разделителя здесь рассматривается только * * =
; вам нужно обрезать конечный пробел по ключу и начальный пробел по значению, если ваши свойства выглядят как name = value
, а не name=value
.