このエコー呼び出しが既存のテキストを上書きするのはなぜですか?

このエコー呼び出しが既存のテキストを上書きするのはなぜですか?

次のCSVファイルを検討してください。

jdbc.driverClassName,oracle.jdbc.driver.OracleDriver

jdbc.username,kshitiz

次のように変換する必要があります。

-Djdbc.driverClassName=oracle.jdbc.driver.OracleDriver \

-Djdbc.username=kshitiz \

以下のbashスニペットが提供されます。

while read l; do
    IFS=',' read -ra arr <<< "$l"
    echo '-D'${arr[0]}'='${arr[1]}' \'
done <properties.txt

印刷のかちりと言う音:

\jdbc.driverClassName=oracle.jdbc.driver.OracleDriver 

\jdbc.username=kshitiz

ここで何が起こっているのでしょうか?

答え1

\jdbc.driverClassName=oracle.jdbc.driver.OracleDriver

スクリプトが実際に出力するものは次のとおりです。

  1. -Djdbc.driverClassName=oracle.jdbc.driver.OracleDriver
  2. 入力する
  3.  \(スペースに注意してください)
  4. 改行文字

スクリプトがキャリッジリターンを印刷するのはなぜですか?これは、入力ファイルにUnixルールの改行文字はありませんが、CRLFと各行末のキャリッジリターンがすでに2番目の配列変数の一部と見なされているためです。

変数にキャリッジリターンなどのスペースが追加されるのはなぜですかread?あなたが変わったからですIFS

賢い人々に伝えるいくつかの言葉:

  • printf代わりに使用echo特にechoこれは、コマンドラインオプションのように見えるものとバックスラッシュがあるものを伝える場合です。
  • hexdump -C出力をcat -vまたはに渡してこれらの問題を診断しますod -t c -t x1
  • そうでない場合は、またはを使用して同じ操作をdos2unix簡単に実行できます。trsedperl

関連情報