考虑以下 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,并且每行末尾的回车符已被视为第二个数组变量的一部分。
为什么像回车符这样的空格被附加到变量上read
?因为你改变了IFS
。
给智者的几句话:
- 使用
printf
,而不是echo
—尤其,就像这里一样,当您传递echo
看起来像命令行选项的内容和带有反斜杠的内容时。 hexdump -C
通过将输出传递给、cat -v
或 来诊断此类问题od -t c -t x1
。- 如果没有
dos2unix
,可以很容易地使用tr
,sed
, 或 来完成相同的操作perl
。