Похоже, вам не нужно его токенизировать. Просто сгенерируйте полученную строку.
Ниже я сначала подставляю каждый :
или ;
на новую строку. Затем с xargs
я читаю 3 переменные одновременно и перехожу к printf
формату. sed 's@/@\\/@g'
делает то же самое, что и LOC_STRING=${LOC_STRING//\//\\\/}
.
SERVER="/api/v1:127.0.0.1:1337;/api/v2:127.0.0.1:1338"
LOC_STRING=$(
printf "%s\n" "$SERVER" |
tr ':;' '\n\n' |
xargs -d$'\n' -n3 printf '\tlocation %s {\\n\t\tproxy_pass http://%s:%s\\n\t}\\n' |
sed 's@/@\\/@g'
)
echo "$LOC_STRING"
:
location \/api\/v1 {\n proxy_pass http:\/\/127.0.0.1:1337\n }\n location \/api\/v2 {\n proxy_pass http:\/\/127.0.0.1:1338\n }\n
Чтобы "токенизировать" его, проще всего вставить новую строку вместо разделителя, и прочитайте это как разделенный новой строкой поток. Будут проблемы, если в строке есть новая строка, но, судя по IFS=';' read -ra ALL_ADDR <<< "${SERVER}"
, в SERVER
нет новых строк или вас интересует только первая строка. Так похоже - замените ;
и :
на новую строку. Тогда только прочитайте 3 пункта за один раз. Используйте <<
для перенаправления чего-либо в оболочке posix.
tmp=$(printf "%s\n" "$SERVER" | tr ';:' '\n\n')
while IFS= read -r PROXY &&
IFS= read -r IPADDR &&
IFS= read -r POST; do
LOC_STRING="${LOC_STRING}\tlocation ${PROXY} {\n\t\tproxy_pass http://${IPADDR}:${PORT}\n\t}\n"
done <<EOF
$tmp
EOF
LOC_STRING=${LOC_STRING//\//\\\/}
Примечание: по договоренности переменные верхнего регистра используются для переменных, которые будут export
ed. Для локальных переменных в скрипте используйте строчные переменные.