我想使用通配符检查 Bash 脚本中是否存在一个或多个目录。
我试过这个;
if [ -d app/*management ]
then
for mscript in `ls -d app/*management`
do
...
done
fi
如果有一个匹配项但会引发错误“预期二元运算符”,则该方法有效。
关于这样做的好方法有什么建议吗?
我想使用通配符检查 Bash 脚本中是否存在一个或多个目录。
我试过这个;
if [ -d app/*management ]
then
for mscript in `ls -d app/*management`
do
...
done
fi
如果有一个匹配项但会引发错误“预期二元运算符”,则该方法有效。
关于这样做的好方法有什么建议吗?
如果表达式中没有 && (and),则不能使用 -d 同时检查多个目录。我会用这个:
for dir in app/*management; do
if [[ -d $dir ]]; then
...
fi
done
您应该使用 glob 而不是解析 ls 的输出。有关更多信息,请参阅以下链接:http: //mywiki.wooledge.org/ParsingLs
你为什么不这样做:
for mscript in app/*management ; do
if [ -d "$myscript" ] ; then
...
fi
done
在 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