我了解到 shell 会扩展某些类型的字符。这就是为什么在写作时:
$ echo *
我得到一个目录和文件列表,比方说我得到:
Applications Desktop Documents
现在,假设我写
$ foo=Applications Desktop Documents
我得到:
-bash: Desktop: command not found
很好,但是写的时候:
$ foo=*
这行得通,为什么?我确信 * 应该展开并给出与上面相同的错误。
写作时
$ echo ${#foo}
我得到答案 1,它表明 * 已保存到 foo
为什么 * 没有在作业中展开?当我写的时候它确实扩展了
$ echo ${foo}
谢谢
变量赋值期间不会发生路径名扩展。以下是 bash 联机帮助页的摘录:
当您执行 的赋值时
foo=*
,foo 变量将包含一个文字*
。当您稍后使用变量(未加引号)时,参数首先扩展为文字*
,然后发生路径名扩展。*
您可以通过引用参数扩展来验证它是否包含文字:在 bash 中这个规则有一些例外,例如在分配数组时:
在上面的示例中,路径名扩展立即发生并且数组包含与 glob 匹配的文件列表。
如果 shell 无法将通配符扩展为 glob,则按字面意思处理: