В общем, я бы выбрал подход поиска и замены с использованием sed / awk, такой как показан в ответ Кента или этот ответ .
Если вы хотите использовать только оболочку, тогда стандартным способом будет использование eval
. Однако это создает угрозу безопасности. Например:
[me@home]$ cat hello.txt
hello $NAME; uname -a
[me@home]$ NAME="shawn"
[me@home]$ 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
Обратите внимание, как команда может быть введена в шаблон!
Однако вы можете уменьшить риск, используя этот подход:
[me@home]$ eval "OUT=\"`cat hello.txt`\""
[me@home]$ 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