Расширение известных env версии в файле и оставление других - PullRequest
0 голосов
/ 17 июня 2011

Я уверен, что есть действительно простой способ сделать это. Я пытаюсь взять файл, который содержит некоторые переменные среды, и расширить его так, чтобы те, которые известны, были расширены до их значений, тогда как те, которые не были оставлены в покое.

Например, если мой файл содержал следующее:

${I_EXIST}
${I_ALSO_EXIST}
${I_DONT_EXIST}

это будет расширено до:

existValue
alsoExistValue
${I_DONT_EXIST}

В идеале я хочу сделать это как можно проще, чтобы не использовать сложную замену с использованием sed, awk или perl. Я думаю о чем-то похожем на файл «Здесь», но кроме того, что я не могу понять синтаксис правильно, он также удаляет все, что не расширяется. Например:

cat <<EOF
> ${I_EXIST}
> ${I_ALSO_EXIST}
> ${I_DONT_EXIST}
EOF
existValue
alsoExistValue

(т.е. последнее значение расширяется до нуля)

Обновление

На самом деле следовало ясно дать понять, что я думаю о потенциально более чем одной замене на строку. Один из способов найти это, если мы не смущаемся переменными, отображаемыми в файле как ${MYVAR}, но, возможно, MYVAR подойдет:

m4 $( env | sed 's/\([A-Za-z0-9]*\)=\([\/A-Za-z_0-9:|%*. -@]*\)/-D\1=\2' ) myfile

При этом используется препроцессор M4 для замены всех пар в вашей среде. Пара икв здесь:

  1. Извините за все, что связано с reg exp. Это выглядит довольно противно, и я уверен, что есть более хорошие способы выразить это. Я обнаружил проблемы, если в моих env vars были пробелы или какие-то необычные символы, которых не было в наборе.
  2. Конечно, это инструмент тупой подстановки (которого я пытался избежать), поэтому переменная может быть подставлена, когда вы этого не хотите.

Ответы [ 3 ]

3 голосов
/ 17 июня 2011
#!/bin/bash

while read a;
do
    n=$(eval echo $a)

    if [[ "$n" == "" ]]
    then
        echo $a
    else
        echo $n
    fi

done < input

Использование этого в качестве ввода

${HOME}
${nonexistent}

Придает

/home/myuser
${nonexistent}
2 голосов
/ 17 июня 2011

Легко читать?Возможно, нет.Он короткий и работает, хотя: -)

while read r; do
echo $(eval echo ${r%\}}:-'$r'\})
done < input

Используемая магия: http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion

Редактировать : дальнейшее объяснение, я надеюсь, что оно немного смысл.

Мы используем две техники;из приведенных выше документов:

$ {параметр: −word} Если параметр не установлен или равен нулю, расширение слова заменяется.В противном случае подставляется значение параметра.

И

$ {параметр% word} Слово раскрывается для создания шаблона, как при расширении имени файла.Если шаблон соответствует завершающей части расширенного значения параметра, то результатом расширения является значение параметра с самым коротким совпадающим шаблоном (случай «%») или самым длинным совпадающим шаблоном (случай «%%»)удален....

Мы используем тот факт, что ввод - это то, что мы можем использовать в оболочке, у нас есть ${FOOBAR}, но нам нужно ${FOOBAR:-'${FOOBAR}'} (одинарные кавычки, чтобы избежать расширения).

# echo ${doesntexist:-Hello}
Hello
# doesexist=World
# echo ${doesexist:-Will not be printed}
World

Итак, нам нужно ввести :-'${FOOBAR}'

. Для этого мы обрезаем } в конце, добавляем строку, а затем добавляем еще один }.

# echo $r
${FOOBAR}
# echo ${r%\}}
${FOOBAR

Финальный \} на самом деле не нужен, поскольку в этом случае у него нет начала, но лучше быть явным и избегать его.(Как если бы вы сбежали echo \*, даже если echo * без соответствующих файлов дает буквальный символ *).

Edit2 : Это, конечно, не учитывает, что выхотел поддерживать несколько переменных в одной строке;или любые строки с другими вещами в них.

1 голос
/ 17 июня 2011
while read name; do echo "$name = " $(eval echo $name); done < file_with_vars.txt

отобразит все переменные, которые знают.

например. в моем файле под названием vv

${PATH}
${HAVENOT}
${LOCALE}

напечатает

${PATH} =  /usr/local/narwhal/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:~/bin
${HAVENOT} = 
${LOCALE} =  UTF-8

измените формат вывода по своему желанию:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...