2016-03-28 7 views
1

HTMLテンプレートを生成するBashスクリプトが必要です。テンプレートには、コマンドラインでの入力引数に基づくライブラリが含まれます。ここに私の考えは次のとおりです。HTMLテンプレートを生成するBashスクリプト

#!/bin/bash 

function libraries 
{ 
    if [ "$1" == "bootstrap" ]; then 
     echo "<link type="text/css" rel="stylesheet" href="css/bootstrap.css" />" 
    fi 
} 

##### Main 

cat << _EOF_ 
    <!DOCTYPE html> 
    <html> 
    <head> 
     <title> </title> 
     $(libraries) 
    </head> 

    <body> 

    </body> 
    </html> 
_EOF_ 

私は./template_creator.sh bootstrapを実行すると、私はこの出力を得る:

<!DOCTYPE html> 
    <html> 
    <head> 
     <title> </title> 

    </head> 

    <body> 

    </body> 
    </html> 

私はif文を含めるとちょうどエコーされない場合は、それが正常に出力します。だから私はトラブルがifステートメントにあると思っています。助言がありますか?

答えて

0
関数内

$1は、最初の引数を参照するには、その関数、ないスクリプトに渡された最初の引数にを可決しました。スクリプトの最初の引数をhere-documentの$(libraries "$1")を使用して関数に渡すか、またはスクリプトの先頭でグローバル変数に代入して、その関数で使用することができます。

+0

この方法で複数の引数を使用できますか? – iCodeYouCodeWeAllCode

+0

@iCodeYouCodeWeAllCode:もちろんですが、気をつけなければ混乱する機会がたくさんあります。たとえば '$(somefunc" $ 2 "" heading "" $ 1 ")'を使用した場合、関数 '$ 1'はスクリプトの第2引数を参照し、' $ 3'は最初のものを参照します。関数が何をするかという点でこれが意味があれば、素晴らしい!しかし、全体を通して一貫性のある参照があることが明確になるならば、グローバルはより良い方法です。それぞれの状況で最も明白なものに基づいてアプローチを組み合わせることもできます。 –

1

$(libraries)の代わりに$(libraries) $1を書きます。

+0

変更が加えられました。 Ran ./template_creator.shブートストラップ。しかし、それはの下に 'ブートストラップ'を示しています。 – iCodeYouCodeWeAllCode

2

printfを使用すると、テンプレートに変数を挿入できます。

テンプレートには、printf形式(例:%s)を挿入ポイントとして使用します。

このようにして、テンプレートにファイルを使用して(tpl=$(cat "main.tpl"で呼び出す)、スクリプト内の変数を処理することもできます。

libraries() { 
    if [ "$1" == "bootstrap" ]; then 
     link='<link type="text/css" rel="stylesheet" href="css/bootstrap.css" />' 
     printf "$tpl" "$link" 
    fi 
} 

##### Main 

read -d '' tpl << _EOF_ 
    <!DOCTYPE html> 
    <html> 
    <head> 
     <title> </title> 
     %s 
    </head> 

    <body> 

    </body> 
    </html> 
_EOF_ 

libraries "$1" 
関連する問題