0

スクリプトで以下の部分を使用して、ファイル内の変数を置き換えています。

ただし、スクリプトのこの部分を実行すると、「&」記号はスクリプトによって無視されます。この動作には理由がありますか?

 while read line
   do
   eval  echo "$line" >> output.txt
   done < "input"

私の入力ファイルは以下のようになります

XXX.6.ID=LCPR_PROJ&
XXX.6.VALUE=$PMS&
XXX.6.CTID=58&
XXX.6.ECID=1032&
XXX.6.SEC=

コマンドを実行した後、私の出力は以下のようになります

XXX.6.ID=LCPR_PROJ
XXX.6.VALUE=132
XXX.6.CTID=58
XXX.6.ECID=1032
XXX.6.SEC=

コマンドで何かを変更する必要がありますか?

4

1 に答える 1

4

使いたくないeval!

eval式を個別に評価し、文字を解釈し&ます。

この&文字は、サブシェルでコマンドを実行するように bash に指示します。Bashのmanページから:

コマンドが制御演算子 & によって終了された場合、シェルはサブシェルのバックグラウンドでコマンドを実行します。

スクリプトから削除します

while read line
  do
    echo "$line" >> output.txt
  done < "input"

期待どおりに動作します。

を介してすべての行を実行したい場合、何をしているのかわかっている場合は、手動でsevalを検出してエスケープする必要があります。&

while read line; do
  line=${line/&/\\&}
  eval echo "$line";
done

bash の文字列操作を使用する。

于 2013-04-08T12:08:41.773 に答える