이 에코 호출이 기존 텍스트를 덮어쓰는 이유는 무엇입니까?

이 에코 호출이 기존 텍스트를 덮어쓰는 이유는 무엇입니까?

다음 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쉽게 수행할 수 있습니다 .trsedperl

관련 정보