Bash脚本无法按预期工作。错误的文件列表行为

时间:2015-12-09 12:49:08

标签: bash

我一直在关注本教程(这个想法也可以在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=(./*)

这把我当前目录中的所有文件都读成一个数组。但是,如果使用除./之外的任何内容,则它不起作用。

如何将此过程用于./?

以外的目录

1 个答案:

答案 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可能过多;最常见的是,您可以在脚本开头设置一次,然后相应地编写脚本。