~에 따르면이 설명서 -r
을 위한 read
:
백슬래시로 문자를 이스케이프할 수 없습니다.
내가 아는 한, 일반적으로 read
쉘 내장 기능은 입력을 받아 해당 입력을 다음과 같이 보관하는 변수를 생성합니다.끈여기서 백슬래시는 문자 그대로의 구성 요소일 뿐이며 어쨌든 어떤 것도 이스케이프하지 않습니다.
read -r
드물고 특수한 사용 사례 에만 해당됩니다 read
(출력의 공통 분모는와는 별개로문자열)?
답변1
내가 아는 한, 일반적으로 읽기 셸 내장 함수는 입력을 받아 해당 입력을 문자열로 유지하는 변수를 생성합니다. 여기서 백슬래시는 리터럴 구성 요소일 뿐이며 어쨌든 아무것도 이스케이프되지 않습니다.
일반적으로 입력이 주어지면 문자열 에 read var
아무것도 저장되지 않습니다 . 백슬래시를 이스케이프 뒤의 문자로 처리하고 백슬래시를 제거합니다. 그것을 얻으려면 입력해야합니다 .-r
foo\bar
var
foobar
foo\\bar
foo\bar
read
다음과 같이 여러 값을 읽는 데 사용할 수 있습니다.
$ read a b <<< 'xx yy'; echo "<$a> <$b>"
<xx> <yy>
( <<<
명령에 대한 입력으로 제공되는 다음 문자열인 "here-string"입니다.)
문자를 IFS
구분 기호로 사용하므로 기본적으로 공백입니다. 백슬래시를 사용하면 이러한 구분 기호를 이스케이프 처리하여 일반 문자로 만들고 백슬래시를 제거할 수 있습니다(백슬래시가 일반 문자 앞에 나타나는 경우에도 마찬가지입니다). 그래서 당신은 얻을 것입니다:
$ read a b <<< 'xx\ yy'; echo "<$a> <$b>"
<xx yy> <>
$ read a b <<< 'xx\n yy'; echo "<$a> <$b>"
<xxn> <yy>
구분 기호를 이스케이프 처리하는 것은 거의 유용하지 않으며 누군가가 C 스타일 문자 이스케이프를 사용하여 문자열을 입력하려는 경우 백슬래시를 제거하는 것도 성가신 일이 될 수 있습니다.
또한 후행 백슬래시는 read
C 및 셸에서 연속 행이 작동하는 방식과 유사하게 첫 번째 행의 연속으로 다른 행이 읽힐 때까지 기다립니다.
의 경우 read -r
백슬래시는 일반 문자입니다.
$ read -r a b <<< 'value\with\backslashes\ yy'; echo "<$a> <$b>"
<value\with\backslashes\> <yy>
많은 사용 사례에서 백슬래시는 사용자가 입력할 것으로 예상되는 것이 아니며, 백슬래시가 없으면 read -r
일반 과 동일 합니다 read
. 그러나 누군가가 백슬래시를 입력해야 하는 경우 백슬래시를 사용하면 read -r
관련된 놀라움을 줄일 수 있습니다. 따라서 read
(프로그램에서 할당할 수 있는 특별한 속성 외에도) 특별해지기를 정말로 원하지 않는 한 이를 사용해도 괜찮을 것입니다 .