![명령줄에서 개행 문자를 사용하여 입력 줄을 읽는 방법은 무엇입니까?](https://linux55.com/image/156188/%EB%AA%85%EB%A0%B9%EC%A4%84%EC%97%90%EC%84%9C%20%EA%B0%9C%ED%96%89%20%EB%AC%B8%EC%9E%90%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%9E%85%EB%A0%A5%20%EC%A4%84%EC%9D%84%20%EC%9D%BD%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
명령줄에서 사용자 입력을 얻을 수 있다는 것을 알았습니다. 그런데 내가 입력한 개행 문자를 인식하지 못합니다. 행위:
#!/bin/bash
read -e -p "Multiline input=" variable;
printf "'variable=%s'" "${variable}";
- 입력하면
'multi\nline'
출력Multiline input=
printf
'variable=multinline'
- 입력하면
'multi\\nline'
출력Multiline input=
printf
'variable=multi\nline'
printf
읽은 새 줄 read -p
, 즉 출력을 어떻게 인쇄합니까?
multi line
대신에 multinline
또는 multi\nline
?
관련 질문:
답변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
이스케이프된 개행 문자를 실제 개행 문자로 대체했습니다.printf
sed
\\n
#!/bin/bash
read -e -p -r "Multiline input=" variable;
printf "'variable=%s'" "${variable}";
variable=$(printf "${variable}" | sed 's/\\n/\n/g');
인용하다: