デバッグを学ぶ:
cat template.txt | for param in ${scriptParams} ; do i=$((++i)) ; echo $i - $param; done
1 - test1,test2,test3
おっとっと..
scriptParams="test1 test2 test3"
cat template.txt | for param in ${scriptParams} ; do i=$((++i)) ; echo $i - $param; done
1 - test1
2 - test2
3 - test3
わかりました、良く見えます...
cat template.txt | for param in ${scriptParams} ; do i=$((++i)) ; sed -e "s/\${$i}/$param/" ; done
param1=test1
param2=${2}
param3=${3}
おっと...それで、何が問題なのですか? さて、最初のsed
コマンドはすべての入力を「食べます」。sed
あるコマンドが次のコマンドにフィードするパイプラインを構築していません... 3 つsed
の が同じ入力を読み取ろうとしています。明らかに、最初のものは入力全体を処理しました。
では、別のアプローチを取りましょう。単一のsed
コマンドの引数を作成しましょう (注: は、コマンド ライン スイッチとして解釈しないよう""
に強制するためのものです)。echo
-e
sedargs=$(for param in ${scriptParams} ; do i=$((++i)); echo "" -e "s/\${$i}/$param/"; done)
cat template.txt | sed $sedargs
param1=test1
param2=test2
param3=test3
それでおしまい。これは完全ではないことに注意してください。置換テキストが複雑な場合 (例: スペースが含まれている場合)、あらゆる種類の問題が発生する可能性があります。
これをより良い方法で行う方法を考えさせてください... (まあ、頭に浮かぶ明らかな解決策は、このタスクにシェルスクリプトを使用しないことです...)
更新: 適切なパイプラインを構築したい場合は、いくつかの解決策があります: bash でパイプ ループを作成する方法