Легко читать?Возможно, нет.Он короткий и работает, хотя: -)
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 : Это, конечно, не учитывает, что выхотел поддерживать несколько переменных в одной строке;или любые строки с другими вещами в них.