入力を読むときに使用されるのはなぜですかread
?入力の???
結果は何ですかbin src
?
$ read
???
$ echo $REPLY
bin src
macOSで実行されますbash
。
答え1
変数に保存されたデータREPLY
はそのままですが???
、変数を使った結果は引用しないwith は、echo
あなたがやっているようにするようなものです
echo ???
すべての変数拡張には二重引用符が必要です。
変数を引用符なしで拡張すると、2つのことが起こります。
- 変数の値は分ける複数の言葉で。文字が文字の1つ
$IFS
(デフォルトではスペース、タブ、および改行)と同じ場合、分割が発生します。あなたの場合、???
値を変更しない限り、分割結果は分割前と同じです(単語1語)。$IFS
- 生成された各単語はファイル名の生成、または「ファイル名ワイルドカード」。つまり、単語がワイルドカードパターンの場合、つまり
???
パターンと一致するすべてのファイル名がパターンを置き換えます。このパターンは???
3文字の長さのすべてのファイル名と一致し、現在の作業ディレクトリには明らかに2つのファイル名があります。
変数拡張が二重引用符で囲まれている場合、これは発生しません。
たとえば、問題を再現して解決してみてください。
$ ls
X11R6 games lib libexec mdec ports share xobj
bin include libdata local obj sbin src
$ read
???
$ echo $REPLY
bin lib obj src
$ echo ???
bin lib obj src
$ echo "$REPLY"
???
上記と同じディレクトリの別の例は、入力文字列が2つの単語(???
およびs*
)に分割され、ファイル名のグロービングパターンとして使用されることを示しています。
$ read
??? s*
$ echo $REPLY
bin lib obj src sbin share src
$ echo "$REPLY"
??? s*
これは、との両方にsrc
一致するため、2回出力されます。???
s*
関連:
上記の質問と回答を簡単にまとめると、次のようになります。 いつも二重引用符みんなただし、どの拡張が必要ないのか分からない場合、または実際に分割とワイルドカードを呼び出す場合は除外されます。