我一直在关注本教程(这个想法也可以在SO的其他帖子中找到)
http://www.cyberciti.biz/faq/bash-loop-over-file/
这是我的测试脚本:
function getAllTests {
allfiles=$TEST_SCRIPTS/*
# Getting all stests in the
if [[ $1 == "s" ]]; then
for f in $allfiles
do
echo $f
done
fi
}
我们的想法是在TEST_SCRIPTS中找到的目录中打印所有文件(每行一个)。
而不是这就是我得到的结果:
/path/to/dir/*
(显然,实际路径,但这是传达这个想法)。
我在bash上尝试了关注实验。这样做
a=(./*)
这把我当前目录中的所有文件都读成一个数组。但是,如果使用除./之外的任何内容,则它不起作用。
如何将此过程用于./?
以外的目录答案 0 :(得分:3)
如果没有匹配项,则不会展开通配符。
我推测TESTSCRIPTS
包含一条不存在的路径;但是如果无法访问您的代码,显然无法正确诊断它。
常见的解决方案包括shopt -s nullglob
,这会导致shell在没有匹配时用空格替换通配符;并明确检查扩展值是否等于通配符(理论上,如果有一个名为字面*
的文件,这可能会失败,所以这不是完全防弹的!)
顺便说一句,allfiles
变量似乎是多余的,你通常应该更加细致地引用。有关详细信息,请参阅When to wrap quotes around a shell variable?。
function getAllTests {
local nullglob
shopt -q nullglob || nullglob=reset
shopt -s nullglob
# Getting all stests in the # fix sentence fragment?
if [[ $1 == "s" ]]; then
for f in "$TEST_SCRIPTS"/*; do # notice quotes
echo "$f" # ditto
done
fi
# Unset if it wasn't set originally
case $nullglob in 'reset') shopt -u nullglob;; esac
}
在单个函数中设置和取消设置nullglob
可能过多;最常见的是,您可以在脚本开头设置一次,然后相应地编写脚本。