一般に、私はKent's answerまたはthis answerに示されているようなsed/awkを使用して、検索と置換の方法に行きます。
シェルのみのアプローチを希望する場合、標準的な方法は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
が重複する可能性を](http://stackoverflow.com/questions/2900707/lazy-evaluation-in-bash) –