我想使用通配符检查Bash脚本中是否存在一个或多个目录。Bash Shell脚本:确认一个或多个目录的存在
我试过这个;
if [ -d app/*management ]
then
for mscript in `ls -d app/*management`
do
...
done
fi
如果只有一个匹配,但是会抛出错误“二元运算符预期”,那么该函数有效。
任何建议一个好办法做到这一点?
我想使用通配符检查Bash脚本中是否存在一个或多个目录。Bash Shell脚本:确认一个或多个目录的存在
我试过这个;
if [ -d app/*management ]
then
for mscript in `ls -d app/*management`
do
...
done
fi
如果只有一个匹配,但是会抛出错误“二元运算符预期”,那么该函数有效。
任何建议一个好办法做到这一点?
您不能使用-d在同一时间检查多个目录,而在你的表情& &(和)。我会用这个:
for dir in app/*management; do
if [[ -d $dir ]]; then
...
fi
done
你应该使用globs而不是解析ls的输出。请参阅以下链接了解更多信息:http://mywiki.wooledge.org/ParsingLs
你为什么不去做这样的:
for mscript in app/*management ; do
if [ -d "$myscript" ] ; then
...
fi
done
水珠扩展到管理目录的列表之后,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
你应该在报价,谢谢'['或'使用[' – jordanm
Ninja'd内的扩张。 – Mat