testingfilesizecheck.sh: line 6: /media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/*
我正在使用命令for f in "/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/*"
如果我对此非常具体并说出来,"/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/ABRA.bin"
那么它就会起作用。
我是 linux (Ubuntu) 和 bash 的新手,我正在努力使用 google-fu 来诊断这个问题。我能找到的每个示例站点都建议我使用通配符所做的工作应该有效,但是他们将示例保存在与终端/bash 脚本正在积极工作的同一目录中。
在发表这篇文章之前,我确实使用 ls 设计了一个解决方法,感觉非常迂回,因为我在文件夹中列出了我的文件列表,并且有点“手动”,而不是使用 for 循环作为简洁的命令。所以我正在寻找学术上的答案,为什么通配符在这种情况下不会扩展。
编辑:我尝试了将星号放在双引号之外的建议。但它也没有用。以下是我目前的回复:
这是我的终端在输入一行“bash testingfilesizecheck.sh”并按下回车后的复制粘贴:
doctor@doctor-X570-AORUS-ELITE:~/Documents$ bash testingfilesizecheck.sh
/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/*
testingfilesizecheck.sh: line 24: /media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/*: No such file or directory
第 24 行来自注释掉我在 testinfilesizecheck.sh 脚本中所做的所有其他尝试。这是该脚本减去注释掉的行。
#!/bin/bash
for f in "/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/"*
do
echo "$f"
actualsize=$(wc -c < "$f")
done
echo $actualsize
同样,/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/ABRA.bin 中有一个文件
但通配符并未扩展以接受 ABRA.bin。在这两种变体中,它只是一个文字星号。我想,是的,基于我对其他编程语言的初步理解,星号作为一个变量是有道理的,它不能在带引号的字符串中。但当然它对我不起作用。
双引号防止通配符
*
(“glob”)被扩展以匹配文件。相反,它被视为文字星号字符。改用它,通配符未被引用:
这里的重要部分是包含空格或其他特殊字符的项目被引用,而通配符不是。您同样可以使用这些变体中的任何一个(为便于阅读缩短了路径):
请注意,除非您设置了
nullglob
(shopt -s nullglob
),否则没有匹配项的情况将导致您在for
循环中进行一次迭代,其中的路径确实包含文字星号字符。如果你不能设置nullglob
,那么在循环的第一行使用类似这样的东西来防止“错误”扩展:在收盘价后加上 *: