Bash 通配符部分匹配目录

Bash 通配符部分匹配目录

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

cd "$HOMEDIR/AppData/Local/GitHub/PortableGit"*"/bin"

但这似乎不起作用——它只接受字符串文字。

有没有简单的方法可以让它正确扩展?

编辑:

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

当我这样做时:

GIT_DIR=$HOMEDIR/AppData/Local/GitHub/PortableGit*/bin
eval GIT_DIR_PASS=$GIT_DIR
echo $GIT_DIR_PASS

我得到了正确的信息

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

答案1

GIT_DIR=$HOMEDIR/AppData/Local/GitHub/PortableGit*/bin

上面的通配符未展开,因为您分配给一个标量变量,该变量只能包含字符串,因此不会发生分词或文件名生成。

eval GIT_DIR_PASS=$GIT_DIR

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

echo $GIT_DIR_PASS

这里通配符被扩展。您不是打印变量的内容,而是打印扩展产生的参数列表,因为变量没有被引用。

你想要:

set -- "$HOMEDIR"/AppData/Local/GitHub/PortableGit*/bin

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

GIT_DIR=$1

选择第一个。

答案2

看一眼这些例子了解如何在bash.另外,忘记那些eval东西。

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

HOMEDIR=/home/$USER
ls "$HOMEDIR/AppData/Local/GitHub/PortableGit/"*"/bin"

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

有一个类似的问题堆栈溢出

相关内容