2016-08-05 5 views
1

パラメータ化された値を持つ対話型プログラム/ユーティリティ内で一連のコマンドを実行する必要があります。 heredocの内部をループする方法はありますか?以下のように.. evalがここに助けてもらえないのかどうかわかりません。以下の例は、インタラクティブがシステムコマンドを認識しないように見えるため、動作しないようです。代わりにutilityExecutableにヒアドキュメントを渡すシェルスクリプト内の "heredoc"内のループ

#!/bin/sh 
list="OBJECT1 OBJECT2 OBJECT3" 
utilityExecutable << EOF 
for i in $list ; do 
utilityCommand $i 
done 
EOF 
+2

よく、ヘレドックはサブシェルです。それはうまくいくかもしれませんが、通常あなたが望むものは(私があなたが発見したと思うように)うまくいかないでしょう。あなたの例が理論的であれば、私は答えることができるのは理論的にはforループが外側にあるようにコードを修正することが可能であるかもしれないということです。 "wrapped-around" 'utilityExecutable'。 Qで実際のコマンドを使用すれば、より簡単に手助けできます。がんばろう。 – shellter

+0

私は、あなたがしようとしていることをよりよく説明する必要があると思います。 'utilityExecutable'に一連の入力行を送りたいのですか? – rici

+0

@rici、yesすべてのコマンドが終了するまでユーティリティを終了せずに、utilityExecutableの中で一連のコマンドを送信/実行する必要があります。これはまだheredocを使って可能ですか? – Kevin

答えて

2

、 同等のパイプにするために必要なテキストです。あなたはutilityExecutableecho forループ内の文、およびパイプループ全体の出力を使用して、必要なテキストを作成することができます。

#!/bin/sh 

list="OBJECT1 OBJECT2 OBJECT3" 

for i in $list; do 
    echo "utilityCommand $i" 
done | utilityExecutable 
+1

優秀!!私が探していたものとまったく同じです。ありがとうございました!! – Kevin

0

はい、これはトリッキーで、混乱することができます!次のようにコードを変更する必要があります。

#!/bin/sh 
list="OBJECT1 OBJECT2 OBJECT3" 
utilityExecutable << EOF 
    list="$list" 
    for i in \$list ; do 
    utilityCommand \$i 
    done 
EOF 

これは、heredocがシェルとは完全に別の独自の変数を使用するためです。 heredocの内部にいるときは、heredoc自身の変数を使用して変更する必要があります。したがって、\ heはheredocの内部でシェル変数の代わりにheredoc自身の変数を参照するために必要です。