В общем, я бы пошел на поиск и заменил подход, используя sed/awk, такой как показано в Kent's answer или this answer.
Если вы хотите использовать только оболочку, тогда стандартным способом будет использование eval
. Однако это создает угрозу безопасности. Например:
[[email protected]]$ cat hello.txt
hello $NAME; uname -a
[[email protected]]$ NAME="shawn"
[[email protected]]$ eval echo "`cat hello.txt`" # DO NOT DO THIS!
hello shawn
Linux SOMEHOST 2.6.9-101.ELsmp #1 SMP Fri May 27 18:57:30 EDT 2011 i686 i686 i386 GNU/Linux
Обратите внимание, как команда может быть введена в шаблон!
Однако вы можете снизить риск использования этого подхода:
[[email protected]]$ eval "OUT=\"`cat hello.txt`\""
[[email protected]]$ echo $OUT
hello shawn; uname -a
Обратите внимание, что это еще не несложный, как команды до сих пор могут быть введены с помощью $(cmd)
или `cmd`
.
Одним словом, вы должны использовать eval
, только если вы понимаете риски и можете контролировать/ограничивать доступ к файлам шаблонов.
Вот пример того, как это может быть применен в сценарии:
function printout {
FILENAME=$1
eval "OUT=\"`cat $FILENAME`\""
echo $OUT
}
NAME=Joe
printout hello.txt
NAME=Nelly
printout hello.txt
возможно дубликат [Ленивые оценки в Bash ] (http://stackoverflow.com/questions/2900707/lazy-evaluation-in-bash) –