Read
read -r 是否僅用於罕見的異常讀取案例?
根據本手冊
-r
:read
不允許反斜杠轉義任何字元
我知道,通常,
read
shell 內置函式獲取輸入並創建一個變數,該變數將該輸入保存為一個字元串,其中反斜杠只是文字組件,無論如何都不會轉義。
read -r
僅用於罕見的特殊案例read
(輸出的公分母不是字元串)?
我知道,通常,內置的 read shell 獲取輸入並創建一個變數,該變數將該輸入保存為字元串,其中反斜杠只是文字組件,無論如何都不會轉義。
Plain
read var
,without-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
則與 plain 相同read
。但是如果有人要(需要)輸入反斜杠,使用read -r
可能會減少所涉及的意外。因此,使用它可能很好,除非您真的知道您希望它們是特殊的read
(除了您的程序可能分配給它們的任何特殊屬性)。