次の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
スクリプトが実際に出力するものは次のとおりです。
-Djdbc.driverClassName=oracle.jdbc.driver.OracleDriver
- 入力する
\
(スペースに注意してください)- 改行文字
スクリプトがキャリッジリターンを印刷するのはなぜですか?これは、入力ファイルにUnixルールの改行文字はありませんが、CRLFと各行末のキャリッジリターンがすでに2番目の配列変数の一部と見なされているためです。
変数にキャリッジリターンなどのスペースが追加されるのはなぜですかread
?あなたが変わったからですIFS
。
賢い人々に伝えるいくつかの言葉:
- —
printf
代わりに使用echo
特にecho
これは、コマンドラインオプションのように見えるものとバックスラッシュがあるものを伝える場合です。 hexdump -C
出力をcat -v
またはに渡してこれらの問題を診断しますod -t c -t x1
。- そうでない場合は、またはを使用して同じ操作を
dos2unix
簡単に実行できます。tr
sed
perl