명령줄에서 개행 문자를 사용하여 입력 줄을 읽는 방법은 무엇입니까?

명령줄에서 개행 문자를 사용하여 입력 줄을 읽는 방법은 무엇입니까?

명령줄에서 사용자 입력을 얻을 수 있다는 것을 알았습니다. 그런데 내가 입력한 개행 문자를 인식하지 못합니다. 행위:

#!/bin/bash
read -e -p "Multiline input=" variable;
printf "'variable=%s'" "${variable}";
  1. 입력하면 'multi\nline'출력Multiline input=printf'variable=multinline'
  2. 입력하면 'multi\\nline'출력Multiline input=printf'variable=multi\nline'

printf읽은 새 줄 read -p, 즉 출력을 어떻게 인쇄합니까?

multi line

대신에 multinline또는 multi\nline?

관련 질문:

  1. 읽기 명령에서 -p 옵션은 무엇을 합니까?
  2. bash: 읽기: "\n"(개행) 문자를 캡처하는 방법은 무엇입니까?
  3. 쉘: 읽기: EOF와 개행 문자를 구별합니다.
  4. https://stackoverflow.com/questions/4296108/how-do-i-add-a-line-break-for-read-command
  5. 줄바꿈으로 구분된 매개변수 읽기
  6. https://stackoverflow.com/questions/43190306/how-to-add-new-line-after-user-input-in-shell-scripting

답변1

입력 \n(예: 두 문자 \의 합 n)이 허용되는 경우 다음을 사용하여 printf해석할 수 있습니다.

#!/bin/bash
IFS= read -rep "Multiline input=" variable;
printf -v variable "%b" "$variable"
printf "'variable=%s'\n" "${variable}";

예를 들어:

~ ./foo.sh
Multiline input=foo\nbar
'variable=foo
bar'

~에서배쉬 매뉴얼:

백슬래시 문자 "\"를 사용하면 다음 문자 읽기 및 줄 연속의 특별한 의미를 제거할 수 있습니다.

"줄 연속" 비트는 줄 구분 기호로 다른 문자를 사용하지 않는 한 줄 바꿈을 이스케이프 처리할 수 없음을 의미하는 것 같습니다.

답변2

@muru가 올바른 bash 답변을 가지고 있습니다.

또 다른 옵션: 백슬래시 시퀀스를 처리하되 입력 문자 printf에 주의해야 합니다.%

read -r input
printf "${input//%/%%}\n"

답변3

or의 기능 중 일부를 사용하는 대신 bash이스케이프된 개행 문자를 실제 개행 문자로 대체했습니다.printfsed\\n

#!/bin/bash
read -e -p -r "Multiline input=" variable;
printf "'variable=%s'" "${variable}";
variable=$(printf "${variable}" | sed 's/\\n/\n/g');

인용하다:

  1. https://stackoverflow.com/questions/52065016/how-to-replace-n-string-with-a-new-line-in-unix-bash-script
  2. https://stackoverflow.com/questions/1251999/how-can-i-replace-a-newline-n-using-sed
  3. https://stackoverflow.com/questions/10748453/replace-comma-with-newline-in-sed-on-macos
  4. sed가 개행 문자를 대체할 수 있나요?

관련 정보