0

我想使用通配符检查 Bash 脚本中是否存在一个或多个目录。

我试过这个;

if [ -d app/*management ]
then
    for mscript in `ls -d app/*management`
    do
        ...
    done
fi

如果有一个匹配项但会引发错误“预期二元运算符”,则该方法有效。

关于这样做的好方法有什么建议吗?

4

3 回答 3

4

如果表达式中没有 && (and),则不能使用 -d 同时检查多个目录。我会用这个:

for dir in app/*management; do
   if [[ -d $dir ]]; then
      ...
   fi
done

您应该使用 glob 而不是解析 ls 的输出。有关更多信息,请参阅以下链接:http: //mywiki.wooledge.org/ParsingLs

于 2012-05-18T13:16:19.227 回答
2

你为什么不这样做:

for mscript in app/*management ; do
  if [ -d "$myscript" ] ; then
    ...
  fi
done
于 2012-05-18T13:14:37.243 回答
2

在 glob 扩展到您的管理目录列表后,if语句看起来像

if [ -d app/1management app/2management ]

由于-d只接受一个参数,bash 不知道如何处理剩余的目录。要 bash,您似乎忘记包含二元运算符。

您可以执行以下操作:

for mscript in app/*management; do
    if [ ! -d $mscript ]; then
        continue
    fi
    ...
done

编辑:正如 jordanm 评论的那样,以下内容可能不是必需的,但我将把它留在这里以供参考,nullglob很高兴知道。

一个警告。如果 app/*management 可能不会扩展到任何内容,则需要nullglob在循环之前设置 shell 选项,否则“app/*management”将被视为文字字符串,而不是 shell glob。

if ! shopt nullglob; then
   setting_nullglob=1
   shopt -qs nullglob
fi
for mscript in app/*management; do
...
done
if [ ${setting_nullglob:-0} = 1 ]; then
    unset setting_nullglob
    shopt -qu nullglob
fi
于 2012-05-18T13:25:24.797 回答