コマンド入力を読むには???を使用してください。

コマンド入力を読むには???を使用してください。

入力を読むときに使用されるのはなぜですかread?入力の???結果は何ですかbin src

$ read
???
$ echo $REPLY
bin src

macOSで実行されますbash

答え1

変数に保存されたデータREPLYはそのままですが???、変数を使った結果は引用しないwith は、echoあなたがやっているようにするようなものです

echo ???

すべての変数拡張には二重引用符が必要です。

変数を引用符なしで拡張すると、2つのことが起こります。

  1. 変数の値は分ける複数の言葉で。文字が文字の1つ$IFS(デフォルトではスペース、タブ、および改行)と同じ場合、分割が発生します。あなたの場合、???値を変更しない限り、分割結果は分割前と同じです(単語1語)。$IFS
  2. 生成された各単語はファイル名の生成、または「ファイル名ワイルドカード」。つまり、単語がワイルドカードパターンの場合、つまり???パターンと一致するすべてのファイル名がパターンを置き換えます。このパターンは???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*

関連:

上記の質問と回答を簡単にまとめると、次のようになります。 いつも二重引用符みんなただし、どの拡張が必要な​​いのか分からない場合、または実際に分割とワイルドカードを呼び出す場合は除外されます。

関連情報