关于bash:确认是否存在一个或多个目录

Confirm the existence of one or more directories

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

我试过这个;

1
2
3
4
5
6
7
if [ -d app/*management ]
then
    for mscript in `ls -d app/*management`
    do
        ...
    done
fi

如果有一个匹配但是抛出错误"二元运算符预期",则可以工作。

有什么建议可以做到这一点吗?


在表达式中没有&&(和)的情况下,不能使用-d同时检查多个目录。我会用这个:

1
2
3
4
5
for dir in app/*management; do
   if [[ -d $dir ]]; then
      ...
   fi
done

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


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

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

由于-d只接受一个参数,因此bash不知道如何处理剩余的目录。对于bash,看起来你忘了包含二元运算符。

您可以执行以下操作:

1
2
3
4
5
6
for mscript in app/*management; do
    if [ ! -d $mscript ]; then
        continue
    fi
    ...
done

编辑:正如jordanm评论的那样,以下可能没有必要,但我会留在这里作为参考,因为nullglob很有必要了解。

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

1
2
3
4
5
6
7
8
9
10
11
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


你为什么不这样做:

1
2
3
4
5
for mscript in app/*management ; do
  if [ -d"$myscript" ] ; then
    ...
  fi
done