为什么此 echo 调用会覆盖现有文本?

为什么此 echo 调用会覆盖现有文本?

考虑以下 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,并且每行末尾的回车符已被视为第二个数组变量的一部分。

为什么像回车符这样的空格被附加到变量上read?因为你改变了IFS

给智者的几句话:

  • 使用printf,而不是echo尤其,就像这里一样,当您传递echo看起来像命令行选项的内容和带有反斜杠的内容时。
  • hexdump -C通过将输出传递给、cat -v或 来诊断此类问题od -t c -t x1
  • 如果没有dos2unix,可以很容易地使用tr, sed, 或 来完成相同的操作perl

相关内容