~によるとこのマニュアル -r
のためread
:
バックスラッシュで文字をエスケープできません。
私が知る限り、通常、シェル組み込みread
関数は入力を受け取り、その入力を次のように保持する変数を生成します。ひもここでバックスラッシュは文字通りのコンポーネントであり、とにかく何もエスケープしません。
read -r
まれで特殊なユースケースにのみ適用されますread
(出力の共通分母はとは別に文字列)?
答え1
私が知る限り、通常、読み取りシェル組み込み関数は入力を受け取り、その入力を文字列として保持する変数を生成します。ここでバックスラッシュはリテラルコンポーネントであり、とにかく何もエスケープされません。
通常、入力が与えられると、文字列に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行とシェルで連続行がどのように機能するかと同様に、最初の行の連続で他の行が読み取られるのを待ちます。
の場合、read -r
バックスラッシュは通常の文字です。
$ read -r a b <<< 'value\with\backslashes\ yy'; echo "<$a> <$b>"
<value\with\backslashes\> <yy>
多くのユースケースでは、バックスラッシュはユーザーが入力すると予想されるものではなく、バックスラッシュがない場合は通常read -r
と同じですread
。ただし、誰かがバックスラッシュを入力する必要がある場合は、バックスラッシュを使用すると関連read -r
する驚きを減らすことができます。したがって、read
(プログラムで割り当てることができる特別な属性に加えて)特別になることを本当に望まない限り、それを使用してもかまいません。