read -r 仅在罕见的 read 特殊用例中使用吗?

read -r 仅在罕见的 read 特殊用例中使用吗?

根据本手册 -r为了read

不允许使用反斜杠转义任何字符

据我所知,一般来说,readshell 内置函数获取输入并创建一个变量,该变量将该输入保存为细绳其中反斜杠只是文字组件,无论如何都不会转义任何内容。

仅用于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(除了您的程序可能分配给它们的任何特殊属性之外)。

相关内容