![Bash 通配符部分匹配目录](https://linux22.com/image/29510/Bash%20%E9%80%9A%E9%85%8D%E7%AC%A6%E9%83%A8%E5%88%86%E5%8C%B9%E9%85%8D%E7%9B%AE%E5%BD%95.png)
我有这个 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
似乎更合适。
有一个类似的问题堆栈溢出。