2017-06-10 19 views
-1

私は実行するために使用するいくつかのコマンドでテキストファイルを作成するbashスクリプトを作成しています。 コマンドの間に、テキストファイルに送信されるエコーメッセージを配置したい、これを習得する方法?

c=0; 
for i in `cat`; do 
echo "bash stopservers.sh $i" >> cmds.txt; 
echo (echo "please wait, stopping Managed server $i") >> cmds.txt 
echo "sleep 10" >>cmds.txt 
c=$((c+1)); 
done < list.txt 

おかげ

+0

----引用符がありません – Kalpanaraim

+0

'echo" echo \ "管理しているサーバ$ i \" ">> cmds.txt'は役に立ちます:-) –

+1

[' for'ループと 'cat'を使わないでください。ファイルの内容を読む。 'read'と' while'ループを使います(http://mywiki.wooledge.org/DontReadLinesWithFor)。 – chepner

答えて

-3

bashまたは sh厳しいですから bashコードを生成
echo 'echo "please wait, stopping Managed server '$i'"' >> cmds.txt 
+0

ありがとう、それは働いた。 – Kalpanaraim

+2

'$ i'の値に二重引用符(たとえば)が含まれていると失敗します。 – ikegami

-1

であなたのecho (echo "please wait, stopping Managed server $i") >> cmds.txt文を交換してください。あなたはbashからbashコードを生成する場合は、次のように

  • 、あなたがprintf %qを使用することができます。

    q() { 
        prefix='' 
        for p in "[email protected]" ; do 
         printf "$prefix"\' 
         printf %s "$p" | sed "s/'/'\\\\''/g" 
         printf \' 
         prefix=' ' 
        done 
    } 
    
    while IFS= read -r line; do 
        printf '%s\n' "$(q bash stopservers.sh "$line"        )" 
        printf '%s\n' "$(q printf '%s\n' "Please wait, stopping managed server $line")" 
        printf '%s\n' "$(q sleep 10             )" 
    done <servers_list.txt >cmds.txt 
    

    while IFS= read -r line; do 
        printf 'bash stopservers.sh %q\n' "$line" 
        printf 'printf %q %q\n' '%s\n' "Please wait, stopping managed server $line" 
        printf 'sleep 10\n' 
    done <servers_list.txt >cmds.txt 
    
  • はあなたがshからbashコードを生成している場合は、次を使用することができます

$iに含めることができる制限はありません。値は適切にエスケープされます。

+0

これは、適切に引用された文字列を保証するための '%q'形式をすでに提供している' bash'にとって非常に複雑だと思います。 – chepner

+0

@chepner、それは素晴らしいです!私は '%q'について知りませんでした! '%q'ソリューションを追加しました(私はあなたの答えが破られてからあなたの答えにコピーしました)。 – ikegami

2

最初に、forループの代わりにwhileループを使用して、各行を正確に処理するようにしてください。

printfを使用すると引用が簡単になります。 %q形式を使用すると、$lineがコマンドラインで正しく引用されます。

ループ全体を本体で行単位で行うのではなく、cmds.txtにリダイレクトすることができます。 - 私はこの が「エコー 『の管理サーバ123」を停止しています。しばらくお待ちくださいマネージドサーバー$ i』の 『>> cmds.txt』 が、以下の出力を得る エコーを停止し、待ってくださいエコー試してみました

c=0 
while IFS= read -r line; do 
    printf 'bash stopservers.sh %q\n' "$line" 
    printf 'printf %q %q\n' '%s\n' "Please wait, stopping managed server $line" 
    printf 'sleep 10\n' 
    c=$((c+1)) 
done <list.txt>> cmds.txt 
関連する問題