2012-01-12 1 views
6

私は社内開発サーバーのサイト作成のセットアップを自動化しようとしています。bashを使用してテンプレートからファイル生成をスクリプト化するにはどうすればよいですか?

現在、システムユーザ、mysqlユーザ、データベース、およびapache configを作成しています。私はどのように1つのbashファイルですべてを行うことができるのか知っていますが、もっときれいにApacheの設定を生成する方法があるかどうか尋ねたかったのです。

私がしたいことは、printfを使うのと同様に、テンプレートに基づいてconfファイルを生成することです。私は確かにprintfを使用することができましたが、sedまたはawkを使用してよりクリーンな方法があると思っていました。

私が単にprintfを使いたいのではない理由は、apache設定が約20行でbashスクリプトの大部分を占有し、読みにくくするためです。

何か助けていただければ幸いです。

+0

プロトタイプのhttpd.confファイルを別々に保管し、実行時に実際のファイルにテンプレート(プロトタイプ)ファイルを編集させるようにします。もちろん、それはスクリプトとテンプレートの2つのファイルが必要であることを意味します。しかし、2つの論理的にばらばらになったファイルは実際には分離しています。 –

+0

はい、それは私が尋ねてきたことです(それがはっきりしない場合は申し訳ありません)が、私はそれを行う方法を知る必要がありました。私はPéterVargaの答えが私にそこにいくつかの調整をもたらすと思う。 – Brendan

答えて

7

のようにsedを。 1つの可能性は:parameter:ですが、テンプレートファイルの正当なテキストと混同しないような類似のマーカーのペアがあれば良いです。あなたが何かを編集することが時々必要と時々ないポイントを取得した場合

sed -e "s/:param1:/$param1/g" \ 
    -e "s/:param2:/$param2/g" \ 
    -e "s/:param3:/$param3/g" \ 
    httpd.conf.template > $HTTPDHOME/etc/httpd.conf 

は(sedawkperlで、...)次のようなsedスクリプトを書きますOあなたが一時的にしないことを確認するためにトラップを使用する必要があります

{ 
echo "s/:param1:/$param1/g" 
echo "s/:param2:/$param2/g" 
echo "s/:param3:/$param3/g" 
if [ "$somevariable" = "somevalue" ] 
then echo "s/normaldefault/somethingspecial/g" 
fi 
} >/tmp/sed.$$ 
sed -f /tmp/sed.$$ httpd.conf.template > $HTTPDHOME/etc/httpd.conf 

注:、あなたはそれが簡単にコマンド・ファイルに関連するsedコマンドを作成し、それを実行するかもしれません

tmp=/tmp/sed.$$ # Consider using more secure alternative schemes 
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15 # aka EXIT HUP INT QUIT PIPE TERM 
...code above... 
rm -f $tmp 
trap 0 

これは、スクリプトがほとんどのもっともらしい信号に対して終了すると、一時ファイルが確実に削除されるようにします。前のコマンドからゼロ以外の終了ステータスを保持し、trap 0コマンドの後にexit $exit_statusを使用することができます。

+0

これは完璧です、ありがとうございます。 – Brendan

1

使用してパラメータをマーキングする方法を選択します。例えば

sed s/%foo%/$foo/g template.conf > $newdir/httpd.conf 
+0

複数のマーカーを複数の異なる値に置き換えるにはどうすればよいですか?つまり、%foo%は$ fooに置き換えられ、%bar%は$ barに置き換えられました。 – Brendan

+1

簡単: 'sed 's /%foo%/ $ foo/g; s /%bar%/ $ bar/g" – tripleee

4

私はここに誰も言及していないことに驚いています。これはおそらくOPが望むものではありませんが、確かにあなたが始めたスクリプトの読みやすさを向上させる方法です。シェルが置換を実行するコンストラクトをエスケープまたはパラメトリックに捨ててください。これに関連して

#!/bin/sh 
# For example's sake, a weird value 
# This is in single quotes, to prevent substitution 
literal='$%"?*=`!!' 
user=me 

cat <<HERE >httpd.conf 
# Not a valid httpd.conf 
User=${user} 
Uninterpolated=${literal} 
Escaped=\$dollar 
HERE 

私は、明確にするために同等の$変数より$ {変数}を推薦し、任意の可能なあいまいさを避けるために。