我有这个 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 分配给另一个变量时,我得到了字符串文字版本。
Run Code Online (Sandbox Code Playgroud)GIT_DIR=$HOMEDIR/AppData/Local/GitHub/PortableGit*/bin
通配符上方没有展开,因为您分配给一个只能包含一个字符串的标量变量,因此不会在那里进行分词或文件名生成。
Run Code Online (Sandbox Code Playgroud)eval GIT_DIR_PASS=$GIT_DIR
在这里,它是一个简单命令的参数,所以通配符被扩展,但它们将被扩展到路径为"GIT_DIR_PATH=...".
Run Code Online (Sandbox Code Playgroud)echo $GIT_DIR_PASS
此处扩展了通配符。您不是在打印变量的内容,而是打印由于变量没有被引用而由扩展产生的参数列表。
你会想要:
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上也有类似的问题。