根据本手册 -r
为了read
:
不允许使用反斜杠转义任何字符
据我所知,一般来说,read
shell 内置函数获取输入并创建一个变量,该变量将该输入保存为细绳其中反斜杠只是文字组件,无论如何都不会转义任何内容。
仅用于read -r
罕见的特殊用例read
(输出的共同点是除了一个字符串)?
答案1
据我所知,一般来说, read shell 内置函数获取输入并创建一个变量,该变量将该输入保存为字符串,其中反斜杠只是文字组件,无论如何都不会转义任何内容。
普通的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 和 shell 中延续行的工作方式。
对于read -r
,反斜杠只是一个常规字符:
$ read -r a b <<< 'value\with\backslashes\ yy'; echo "<$a> <$b>"
<value\with\backslashes\> <yy>
在许多用例中,反斜杠并不是人们期望用户输入的内容,如果没有反斜杠,则read -r
与普通的相同read
。但如果有人(需要)输入反斜杠,使用反斜杠read -r
可能会减少所涉及的意外。因此,使用它可能很好,除非您真的知道您希望它们具有特殊性read
(除了您的程序可能分配给它们的任何特殊属性之外)。