我有以下代码:
#!/bin/sh (it is dash for me)
#... lines of code
dir="/home/user/files/" #as example, actually passed as commandline argument
for file in "$dir"/*.java; do
echo "$file"
done
我得到的输出是:
/home/user/files//*.java
在这种情况下,为什么我的shell忽略了glob?
编辑:当然,我检查了目录中是否存在现有的Java文件。该目录中有Java文件。
问题是,当我给它绝对的目录名称而不是变量时,它似乎起作用了
编辑2:好吧,没关系!就像在命令行参数中拼写错误一样简单!抱歉,我不得不打扰您,我已经寻找问题了一段时间,只是被卡住了。但是感谢您抽出宝贵的时间来寻找解决方案!
答案 0 :(得分:0)
根据POSIX shell规范的section 2.13.3:
如果该模式与任何现有的文件名或路径名都不匹配,则模式字符串应保持不变。
它并没有忽略glob,它只是无法匹配任何文件。目录中没有任何Java源文件。
其他shell可以修改此行为。举两个例子,
bash
在默认情况下按字面意义处理了不匹配的模式,但是具有将一个模式视为错误列表或空列表的选择(在这种情况下,甚至不会输入循环)。
zsh
具有相似的选项,但默认情况下会将模式视为错误。