read -r は、読み取りのまれな特殊なユースケースにのみ使用されますか?

read -r は、読み取りのまれな特殊なユースケースにのみ使用されますか?

~によるとこのマニュアル -rのためread

バックスラッシュで文字をエスケープできません。

私が知る限り、通常、シェル組み込みread関数は入力を受け取り、その入力を次のように保持する変数を生成します。ひもここでバックスラッシュは文字通りのコンポーネントであり、とにかく何もエスケープしません。

read -rまれで特殊なユースケースにのみ適用されますread(出力の共通分母はとは別に文字列)?

答え1

私が知る限り、通常、読み取りシェル組み込み関数は入力を受け取り、その入力を文字列として保持する変数を生成します。ここでバックスラッシュはリテラルコンポーネントであり、とにかく何もエスケープされません。

通常、入力が与えられると、文字列にread var何も保存されません。バックスラッシュをエスケープの後ろの文字として処理し、バックスラッシュを削除します。それを得るために入力する必要があります。-rfoo\barvarfoobarfoo\\barfoo\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スタイルの文字エスケープを使用して文字列を入力したい場合は、バックスラッシュを削除するのも面倒です。

さらに、末尾のバックスラッシュは、readC行とシェルで連続行がどのように機能するかと同様に、最初の行の連続で他の行が読み取られるのを待ちます。

の場合、read -rバックスラッシュは通常の文字です。

$ read -r a b <<< 'value\with\backslashes\ yy'; echo "<$a> <$b>"
<value\with\backslashes\> <yy>

多くのユースケースでは、バックスラッシュはユーザーが入力すると予想されるものではなく、バックスラッシュがない場合は通常read -rと同じですread。ただし、誰かがバックスラッシュを入力する必要がある場合は、バックスラッシュを使用すると関連read -rする驚きを減らすことができます。したがって、read(プログラムで割り当てることができる特別な属性に加えて)特別になることを本当に望まない限り、それを使用してもかまいません。

関連情報