YardenST Asked: 2018-11-23 10:30:50 +0800 CST2018-11-23 10:30:50 +0800 CST 2018-11-23 10:30:50 +0800 CST 使用 ??? 读取命令 输入 772 为什么用 读取输入时read,输入是???结果是bin src? $ read ??? $ echo $REPLY bin src bash在 macOS 上运行。 bash osx 1 个回答 Voted Best Answer Kusalananda 2018-11-23T10:38:56+08:002018-11-23T10:38:56+08:00 变量REPLY中保存的数据仍然是???,但是使用不带引号的变量的结果,就像echo你在做的一样,和做的一样 echo ??? 您需要双引号所有变量扩展。 当您不引用变量扩展时,会发生两件事: 变量的值被拆分成多个单词。只要字符与其中一个字符相同$IFS(默认为空格、制表符和换行符),就会发生拆分。在您的情况下,如果未修改???的值,则拆分结果与拆分前(单个单词)相同。$IFS 每个生成的单词都经过文件名生成或“文件名通配”。这意味着如果一个词是一个通配模式,也就是说???,任何匹配该模式的文件名都将替换该模式。该模式???匹配任何三个字符长的文件名,并且您显然在当前工作目录中有两个。 如果变量扩展被双引号括起来,这些事情都不会发生。 例如,重新创建您的问题并解决它: $ 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" ??? 与上面相同目录中的另一个示例,显示我输入的字符串被拆分为两个单词 (???和s*),然后将它们用作文件名通配模式: $ read ??? s* $ echo $REPLY bin lib obj src sbin share src $ echo "$REPLY" ??? s* 请注意,它src会输出两次,因为它同时匹配???和s*。 有关的: 为什么我的 shell 脚本会因空格或其他特殊字符而阻塞? 什么时候需要双引号? 上述问题和答案的简短摘要: 始终对所有扩展进行双引号,除非您确切知道哪些扩展不需要它,或者您是否真的想调用拆分和通配。
变量
REPLY
中保存的数据仍然是???
,但是使用不带引号的变量的结果,就像echo
你在做的一样,和做的一样您需要双引号所有变量扩展。
当您不引用变量扩展时,会发生两件事:
$IFS
(默认为空格、制表符和换行符),就会发生拆分。在您的情况下,如果未修改???
的值,则拆分结果与拆分前(单个单词)相同。$IFS
???
,任何匹配该模式的文件名都将替换该模式。该模式???
匹配任何三个字符长的文件名,并且您显然在当前工作目录中有两个。如果变量扩展被双引号括起来,这些事情都不会发生。
例如,重新创建您的问题并解决它:
与上面相同目录中的另一个示例,显示我输入的字符串被拆分为两个单词 (
???
和s*
),然后将它们用作文件名通配模式:请注意,它
src
会输出两次,因为它同时匹配???
和s*
。有关的:
上述问题和答案的简短摘要: 始终对所有扩展进行双引号,除非您确切知道哪些扩展不需要它,或者您是否真的想调用拆分和通配。