2017-01-09 9 views
0

私はbashに次の変数を持っています: $ httpd_server_count、この変数には1または2などの値を入れることができます。そして、この値に応じて$設定で適切な値を取得する必要があります変数。文字列は次のとおりです。変数に別の変数に応じて文字列値を追加する

1 $ httpd_server_count =場合:

settings={'httpd1': {'server': 'settings.server1'}, 

$ httpd_server_count = 2場合:

settings={'httpd1': {'server': 'settings.server1'}, {'httpd2': {'server': 'settings.server2'}, 

し、カウントすることができ10およびそれ以上までです。それをコードで正しく整理するには? forループ

+1

_コードで正しく整理する方法_これには何が問題なのですか、なぜ新しいものが必要なのですか? – Inian

+0

コードを複製したくない主な理由は、最大数が50の場合、if文が非常に大きくなります。 – BigBoss

+0

配列にどのようになるか例を示してください。 – BigBoss

答えて

3

私はあなたが必要としているものに少しは不明だが、あなたがhttpd_server_countの値を読み、数1, 2, whateverに基づいて必要なサーバーの文字列を生成したい表示されます。私はそれが正しい場合、1つの方法は、httpd_server_countに基づく単純なCスタイルforループを使用することです。たとえば:

#!/bin/bash 

str= 
for ((i = 1; i <= $httpd_server_count; i++)); do 
    str="${str}{'httpd$i': {'server': 'settings.server$i'}, " 
done 

echo -e "str\n\n$str" 

あなたはまだ、末尾,をトリミングし、必要に応じて決算'}'を追加するための責任を負うことになります。 httpd_server_countのあなたの価値が1であればしかし、その後、あなたが得る:それは2ある場合

{'httpd1': {'server': 'settings.server1'}, 

を、あなたが得る:

{'httpd1': {'server': 'settings.server1'}, {'httpd2': {'server': 'settings.server2'}, 

これはあなたが使用して実行することができますアイデアを与えることがあります。ご質問がある場合はお知らせください。

+0

'++'は同じようにしてしまいました!それを別のものとして掲示しない。配列を使用しているBTWは少し綺麗に見えます。しかし、適切なJSONツールが理想的な方法です。 – Inian

2

用途:

#!/bin/bash 
for i in `seq $httpd_server_count`; do 
    settings+="{'httpd$i': {'server': 'settings.server$i'}, " 
done 
+0

いいえ、文字列でも動作しています。 man bash: '代入文で シェル変数または配列インデックスに値を代入するコンテキストでは、+ =演算子を使用して に追加するか、変数の前の値に追加することができます。これには、代入命令 (宣言コマンド)を受け入れる宣言のような組み込みコマンドの への引数が含まれます。 [...] + =配列変数に適用されたとき[...] ' –

+0

合意しました、私の悪い!乾杯! – Inian

3

使用機能bashコードがよりポータブルかつ効率的にする(方法によって、JSONパーサーは、一般jqように、好ましいです)。コードを以下のようなラッパーに入れてください。ロジックは、

function settingsGenerator() { 
    local httpd_server_count=$1 

    local i 
    local settings 

    for ((i=1; i<=httpd_server_count; i++)) 
    do 
     settings="${settings}{'httpd$i': {'server': 'settings.server$i'}, " 
    done 

    printf "%s" "$settings" 
} 

このDavid C. Rankin's answerと同様であり、変数関数の出力を格納する、settings

として
settings=$(settingsGenerator 2) 
printf "%s\n" "$settings" 
{'httpd1': {'server': 'settings.server1'},{'httpd2': {'server': 'settings.server2'}, 

アレイを使用して何かのような小さな変更を必要とするであろう、

function settingsGenerator() { 
    local httpd_server_count=$1 

    local i 
    local settings=() 

    for ((i=1; i<=httpd_server_count; i++)) 
    do 
     settings+="{httpd$i': {'server': 'settings.server$i'}, " 
    done 

    printf "%s" "${settings[@]}" 
} 
関連する問題