Bash 引号内的通配符

Bash 引号内的通配符,bash,glob,Bash,Glob,当我执行以下操作时: rmdir /path/to/dir/*.lproj 它很好用 当我这样做时: APP_RESOURCES="/path/to/dir" rmdir "$APP_RESOURCES/*.lproj" 它不起作用,说它实际上是在查找一个名为astrix符号的目录。通配符不会被解释。如何使其在报价单中工作?扩展由shell处理,因此您必须编写如下内容: APP_RESOURCES="/path/to/dir" rmdir "${APP_RESOURCES}/"*.lproj

当我执行以下操作时:

rmdir /path/to/dir/*.lproj
它很好用

当我这样做时:

APP_RESOURCES="/path/to/dir"
rmdir "$APP_RESOURCES/*.lproj"

它不起作用,说它实际上是在查找一个名为astrix符号的目录。通配符不会被解释。如何使其在报价单中工作?

扩展由shell处理,因此您必须编写如下内容:

APP_RESOURCES="/path/to/dir"
rmdir "${APP_RESOURCES}/"*.lproj

在双引号内不进行全局搜索。做

APP_RESOURCES="/path/to/dir"
rmdir "$APP_RESOURCES"/*.lproj

有关详细信息,请参见此。

如果您引用的是变量展开式,请继续这样做。糟糕的是,你试图引用你的格洛宾语。对于shell to glob,您不应引用:

app_resource="/path/to/dir"
rmdir "$app_resource"/*.lproj

但是这仍然会扩展到<代码> /PATT//DIR/*.LPROJ在没有匹配的情况下,考虑如下:

% app_resource="/path/to/dir"
% echo "$app_resource/something/that/doesnt/exists/"*.abc
/path/to/dir/something/that/doesnt/exists/*.abc
一种解决方法是检查文件/目录是否存在:

app_resource="/path/to/dir"
dir_to_remove="$app_resource/"*.lproj
[ -d "$dir_to_remove" ] && rmdir "$dir_to_remove"