Обычно я занимаюсь анализом вместо источника, чтобы избежать сложностей некоторых артефактов в моем файле. Он также предлагает мне способы специально обрабатывать цитаты и другие вещи. Моя главная цель - сохранить все, что приходит после «=», как литерала, даже двойных кавычек и пробелов.
#! / Bin / bash function cntpars () {echo "& gt; Count : $ # "echo" & gt; Pars: $ * "echo" & gt; par1: $ 1 "echo" & gt; par2: $ 2 ", если [[$ # = 1 & amp; & amp; & amp; $ 1 = "значение content"]]; then echo "& gt; PASS" else echo "& gt; FAIL" return 1 fi} function readpars () {while read -r line; do key = $ (echo "$ {line}" | sed -e 's / ^ \ ([^ =] * \) = \ (. * \) $ / \ 1 /') val = $ (echo "$ {line} "| sed -e 's / ^ \ ([^ =] * \) = \ (. * \) $ / \ 2 /' -e 's /" / \\ "/ g') eval" $ {key} = \ "$ {val} \" "done & lt; & lt; EOF var1 = "value content" var2 = value content EOF} # Вариант 1: Будет проходить эхо "eval \" cntpars \ $ var1 \ "" eval "cntpars $ var1" # Вариант 2: Будет ли сбой эха "cntpars \ $ var1" cntpars $ var1 # Вариант 3: Будет ли сбой echo "cntpars \" \ $ var1 \ "" cntpars "$ var1" # Вариант 4: Будет ли проходить эхо "cntpars \" \ $ var2 \ "" cntpars "$ var2"
Обратите внимание на небольшой трюк, который мне пришлось сделать, чтобы рассмотреть мой цитируемый текст как единственный параметр с пробелом для моей функции cntpars
. Требуется один дополнительный уровень оценки. Если бы я не сделал этого, как в Варианте 2, я бы прошел 2 параметра следующим образом:
"значение
content "
Двойное цитирование во время выполнения команды заставляет сохранять двойные кавычки из файла параметров. Следовательно, третий вариант также терпит неудачу.
Другим вариантом было бы, конечно, просто не предоставлять переменные в двойных кавычках, как в Варианте 4, а затем просто убедиться, что вы укажете их при необходимости. [ ! d12]
Просто что-то, о чем нужно помнить.
Еще одна вещь, которую мне нравится делать - это искать в режиме реального времени, избегая использования переменные среды:
lookup () {если [[-z "$ 1"]]; затем echo "" else $ {AWK} -v "id = $ 1" 'BEGIN {FS = "="} $ 1 == id {print $ 2; exit} '$ 2 fi} MY_LOCAL_VAR = $ (поиск CONFIG_VAR filename.cfg) echo "$ {MY_LOCAL_VAR}"
Не самый эффективный, но с меньшими файлами работает очень чисто.