Аргументы функции bash с пробелами из переменной?

Вопрос запутанный, в общем у меня происходит примерно следующее
while read  line || [[ -n "$line" ]];
do
	l=$(echo "${line}")
	lo_m "${loc_file}" ${line}
done < "${appname}.loc"


т.е. из файла считывается строчка, которая содержит примерно это
"string" "value vvv"

Теперь возьмем такой пример, чтобы все всё поняли
#!/bin/bash
myvar="\
\"str1\" \"var1 vvv\"
\"str2\" \"var2 www\""

echo "$myvar";

myfunc(){
echo "$1 :: $2 :: $3"
}

echo "$myvar" | while read -r line;
do
	myfunc "str multi" $line
done


И что получим на выводе?
первый аргумент "str multi" - передается как один и кавычки убираются, второй аргумент так с кавычками и передается, а третий рвется еще на два по пробелу, хотя заключен в кавычки
"str1" "var1 vvv"
"str2" "var2 www"
str multi :: "str1" :: "var1
str multi :: "str2" :: "var2


Как передавать заранее подготовленные аргументы из переменной или файла, чтобы они адекватно парсились ?
  • Вопрос задан
  • 434 просмотра
Решения вопроса 1
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
В файле у вас не разные аргументы, а просто строка.
Вы ее и передаете как строку, и ожидаете, что команда read ее распарсит на отдельные аргументы.
Но read так не делает.

Правильный способ - пользоваться CSV файлами, в которых будет лежать:
str1,var1 vvv
str2,var2 www
И тогда можете парсить по запятым (или взять в качестве разделителя любой друой символ, который не встречается в ваших данных)
while read; do
  echo ${REPLY} | cut -d "," --output-delimiter ":" -f 1,2
done <<<'str1,var1 vvv
str2,var2 www'


Если хотите чтобы файл парсился по кавычкам, пишите парсер на прочитанный line, или уже внутри вашей функции парсер (можно даже тот же cut натравить на кавычки, и пропускать промежуточные столбцы):
while read; do
  echo "${REPLY}" | cut -d "\"" --output-delimiter ":" -f 2,4
done <<<'"str1" "var1 vvv"
"str2" "var2 www"'

Но это уже велосипед.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы