Bash 通配符部分匹配目录

Ley*_*dis 5 bash wildcards

我有这个 bash 脚本,它试图找到一个在人们系统上部分更改的目录。

cd "$HOMEDIR/AppData/Local/GitHub/PortableGit"*"/bin"
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用 - 它只需要字符串文字。

有没有容易让它正确扩展的方法?

编辑:

好吧,这很奇怪,它有时会起作用。

当我这样做时:

GIT_DIR=$HOMEDIR/AppData/Local/GitHub/PortableGit*/bin
eval GIT_DIR_PASS=$GIT_DIR
echo $GIT_DIR_PASS
Run Code Online (Sandbox Code Playgroud)

我得到了正确的信息

但是当我尝试将 $GIT_DIR_PASS 分配给另一个变量时,我得到了字符串文字版本。

Sté*_*las 8

GIT_DIR=$HOMEDIR/AppData/Local/GitHub/PortableGit*/bin
Run Code Online (Sandbox Code Playgroud)

通配符上方没有展开,因为您分配给一个只能包含一个字符串的标量变量,因此不会在那里进行分词或文件名生成。

eval GIT_DIR_PASS=$GIT_DIR
Run Code Online (Sandbox Code Playgroud)

在这里,它是一个简单命令的参数,所以通配符被扩展,但它们将被扩展到路径为"GIT_DIR_PATH=...".

echo $GIT_DIR_PASS
Run Code Online (Sandbox Code Playgroud)

此处扩展了通配符。您不是在打印变量的内容,而是打印由于变量没有被引用而由扩展产生的参数列表。

你会想要:

set -- "$HOMEDIR"/AppData/Local/GitHub/PortableGit*/bin
Run Code Online (Sandbox Code Playgroud)

那就是将该模式扩展到匹配文件列表中,并将它们分配给$1, $2...

GIT_DIR=$1
Run Code Online (Sandbox Code Playgroud)

选择第一个。


小智 0

查看这些示例以了解如何在bash. 另外,忘记那些eval东西。

一个 glob,将匹配所有名为的目录,/bin/这些目录是 的任何直接子目录的直接子目录.../PortableGit/:

HOMEDIR=/home/$USER
ls "$HOMEDIR/AppData/Local/GitHub/PortableGit/"*"/bin"
Run Code Online (Sandbox Code Playgroud)

我认为cd是你的问题。您到底希望它做什么?如果有多个目录与您的表达式匹配,那么以这种方式调用它是徒劳的,因为cd无论您计划在那里做什么,最终都会出现在第一个匹配的目录中。如果您想顺序输入目录并在其中执行操作,那么对符合要求的输出执行循环find似乎更合适。

stackoverflow上也有类似的问题。