Read

read -r 是否僅用於罕見的異常讀取案例?

  • February 22, 2021

根據本手冊 -rread

不允許反斜杠轉義任何字元

我知道,通常,readshell 內置函式獲取輸入並創建一個變數,該變數將該輸入保存為一個字元串,其中反斜杠只是文字組件,無論如何都不會轉義。

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(除了您的程序可能分配給它們的任何特殊屬性)。

引用自:https://unix.stackexchange.com/questions/635834