为什么读取输入时用read
,而输入的???
结果是bin src
?
$ read
???
$ echo $REPLY
bin src
在 macOS 上运行bash
。
答案1
变量中保存的数据REPLY
仍然是???
,但是使用变量的结果未引用的with echo
,就像你正在做的那样,与doing相同
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*
。
有关的:
上述问题和答案的简短摘要: 总是双引号全部扩展,除非您确切地知道哪些扩展不需要它或者您实际上想要调用拆分和通配符。