2012-05-18 46 views
0

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

我试过这个;

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

如果只有一个匹配,但是会抛出错误“二元运算符预期”,那么该函数有效。

任何建议一个好办法做到这一点?

回答

4

您不能使用-d在同一时间检查多个目录,而在你的表情& &(和)。我会用这个:

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

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

2

你为什么不去做这样的:

for mscript in app/*management ; do 
    if [ -d "$myscript" ] ; then 
    ... 
    fi 
done 
+0

你应该在报价,谢谢'['或'使用[' – jordanm

+0

Ninja'd内的扩张。 – Mat

2

水珠扩展到管理目录的列表之后,if语句看起来像

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

由于-d只有一个参数,bash将不知道该怎么用剩下的目录来做。为了打击,它看起来像你忘了包含一个二元运算符。

你可以做只是做到以下几点:

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

编辑:由于jordanm评论,下面可能是没有必要的,但我会离开这里作为参考,nullglob是很好的了解。

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

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

扩展为“app/* management”的glob应该没问题,因为它会使'[-d'检查失败。 – jordanm

+0

@jordanm - 那个想法超出了我的想法,但不够强烈让我记得提及它:)感谢您指出它。 – chepner

相关问题