为什么我的 bash 脚本不能正确导航?

为什么我的 bash 脚本不能正确导航?

我对该脚本的最终目标是:

  1. 循环访问文件夹
  2. 找出descriptor.mod
  3. 将其重命名为其文件夹名称
  4. 将其重新定位到特定文件夹
  5. 重复

目前,当我尝试访问该文件夹时出现此错误

$ . a.sh
bash: cd: 'a.sh/': No such file or directory
haha
bash: cd: 'Folder 1/': No such file or directory
haha
bash: cd: 'Folder 2/': No such file or directory
haha
bash: cd: 'Folder 3/': No such file or directory
haha
bash: cd: 'Folder 4/': No such file or directory
haha
bash: cd: 'Folder 5/': No such file or directory
haha
bash: cd: 'Folder 6/': No such file or directory
haha

这是我的代码。有六个文件夹名为Folder {number}

for f in *
do
    cd "'$f/'"
    echo "haha"
    cd ..
done

cd "E:\School\LINUX"

编辑:找到了。我改成for f in *for f in */

答案1

该命令cd "'$f/'"包含外部双引号,在达到引用目的后,shell 会将其删除。内部单引号将保留下来并作为cd参数的一部分。(有关引号内的引号的更多信息,请参见此处:参数扩展(变量扩展)和引号内的引号

实际上你正在cd尝试'Folder 1/'文字单引号,而现有目标是Folder 1/。没有'Folder 1/'目录。


另外*还匹配非目录。a.sh是脚本。添加后/ 单引号,您正在尝试cd'a.sh/'没有这样的目录。

cd进入此非目录失败后,您随后还会运行cd ..,这将带您离开起始目录并进入其父目录。从这里开始,最初*匹配的实体不再可见,因此所有进一步的尝试也会cd失败……事实上,每次后续失败cd都会带您上移一个目录。


for f in */只需要迭代目录(但请注意*不匹配点文件)。那么您不需要添加,/因为尾部斜杠出现在扩展中$f(尽管另一个尾部斜杠不会破坏任何内容)。而且您绝对不应该在参数中添加单引号cd。相关行应该是cd "$f"


您可以使用如下循环来遍历所有实体,跳过非目录并cd正确处理错误:

  • [ ! -d "${f}" ] && continue跳过非目录(注意:这仍然会匹配指向目录的符号链接)
  • cd "${f}" || continue跳过我们无法进入的目录(例如:权限)
  • pushd "${f}"/popd避免相对cd返回尝试
for f in *; do
    # skip non-directories
    [ ! -d "$f" ] && continue

    # skip processing for directories we can't enter (e.g: permissions)
    pushd "$f" || continue

    echo "hi"
    pwd

    popd
done

相关内容