bash将某些文件名打印为文本
在过去的几周里,我花了很多时间在这里发帖。我最终认为我离学习bash更近了,但我的代码有一个问题,我一辈子都无法弄清楚它为什么不能运行。我可以运行终端中的每一行,它会返回一个结果,但由于某种原因,当我指向它运行时,它不会做任何事情。我得到一个语法错误:单词unexpected(应为“do”)bash将某些文件名打印为文本,bash,printing,if-statement,Bash,Printing,If Statement,在过去的几周里,我花了很多时间在这里发帖。我最终认为我离学习bash更近了,但我的代码有一个问题,我一辈子都无法弄清楚它为什么不能运行。我可以运行终端中的每一行,它会返回一个结果,但由于某种原因,当我指向它运行时,它不会做任何事情。我得到一个语法错误:单词unexpected(应为“do”) 我错过了什么 我会这样做的 #!/bin/bash -e image="/Home/Desktop/epubs/images" (cd "$image" for f in *.jpg; do
我错过了什么 我会这样做的
#!/bin/bash -e
image="/Home/Desktop/epubs/images"
(cd "$image"
for f in *.jpg; do
let fsize=$(stat -c %s "$f")
if (( fsize == 40318 )); then
echo "$f"
fi
done) >results.txt
-e
表示如果出现任何错误,脚本将退出(例如,无法将cd放入目录)。当您对该行为感到满意时,可以节省大量的错误检查
括号表示cd
命令位于子shell中;周围的脚本(包括重定向到results.txt
)仍然在您启动的任何目录中
现在我们在目录中,只需查找*.jpg
,不需要目录前缀,也不需要对任何内容调用basename
使用让
和(==)
将大小值视为一个数字而不是一个字符串,这样我们就不会被stat
选择格式化值的方式中的任何古怪行为绊倒
我们只是将整个循环的输出重定向到结果文件中,而不是每次都追加;效率更高。如果您想保留
results.txt
中的现有内容,只需将
更改回>
,但将其保留在整个循环中仍然比在每次迭代时打开并附加到该文件更有效。我将这样做
#!/bin/bash -e
image="/Home/Desktop/epubs/images"
(cd "$image"
for f in *.jpg; do
let fsize=$(stat -c %s "$f")
if (( fsize == 40318 )); then
echo "$f"
fi
done) >results.txt
-e
表示如果出现任何错误,脚本将退出(例如,无法将cd放入目录)。当您对该行为感到满意时,可以节省大量的错误检查
括号表示cd
命令位于子shell中;周围的脚本(包括重定向到results.txt
)仍然在您启动的任何目录中
现在我们在目录中,只需查找*.jpg
,不需要目录前缀,也不需要对任何内容调用basename
使用让
和(==)
将大小值视为一个数字而不是一个字符串,这样我们就不会被stat
选择格式化值的方式中的任何古怪行为绊倒
我们只是将整个循环的输出重定向到结果文件中,而不是每次都追加;效率更高。如果要保留
results.txt
中的现有内容,只需将
更改回>
,但将其保留在整个循环中仍然比在每次迭代时打开并附加到文件更有效。问题可能在于行结尾。确保脚本文件具有unix行结尾,而不是Windows行结尾
另外,不要迭代ls
的输出。在shell中使用右侧的globbing:
for f in "$file"/*.jpg ; do
问题可能出在行尾。确保脚本文件具有unix行结尾,而不是Windows行结尾 另外,不要迭代
ls
的输出。在shell中使用右侧的globbing:
for f in "$file"/*.jpg ; do
for循环似乎缺少要迭代的值列表:
image="/Home/Desktop/epubs/images"
for f in $(ls "$image"*.jpg); do
由于$image
不以/结尾,因此ls
命令扩展为
for f in $(ls /Home/Desktop/epubs/images*.jpg); do
这可能会导致
for f in ; do
导致语法错误。最简单的解决方法是
for f in $(ls "$image"/*.jpg); do
但是你应该接受其他答案中的建议,跳过ls
:
for f in "$image"/*.jpg; do
for循环似乎缺少要迭代的值列表:
image="/Home/Desktop/epubs/images"
for f in $(ls "$image"*.jpg); do
由于$image
不以/结尾,因此ls
命令扩展为
for f in $(ls /Home/Desktop/epubs/images*.jpg); do
这可能会导致
for f in ; do
导致语法错误。最简单的解决方法是
for f in $(ls "$image"/*.jpg); do
但是你应该接受其他答案中的建议,跳过ls
:
for f in "$image"/*.jpg; do
您的
ls
命令起到了美化回音的作用-假设它可以工作,如果没有“$image”
和*.jpg
之间的/
,它可能无法工作。只需对“$image”/*.jpg中的f执行;执行
。另外,在--printf=
和'%s'
之间还有一个额外的空格,这将中断stat
命令。@sean解释一下你的意思please@CuriousGeorge您已经在StackOverflow上提出了5个其他问题,但从未将其中一个回答标记为答案。@CuriousGeorge当您提出问题时,如果你得到一个对你有帮助的答案,你应该“接受”这个答案。这会给回答您的人带来声誉积分,也会给其他人更多的激励,让他们将来回答您的问题。@MarkReed谢谢,我会回去接受所有的回答您的ls
命令就像一个荣耀的回声-假设它能工作,如果之间没有/
“$image”,它可能不会工作
和*.jpg
。只需对“$image”/*.jpg中的f执行;执行
。另外,在--printf=
和'%s'
之间还有一个额外的空格,这将中断stat
命令。@sean解释一下你的意思please@CuriousGeorge您已经在StackOverflow上提出了5个其他问题,但从未将其中一个回答标记为答案。@CuriousGeorge当您提出问题时,如果你得到一个对你有帮助的答案,你应该“接受”这个答案。这会给回答您问题的人带来声誉积分,并鼓励其他人在将来回答您的问题。@MarkReed谢谢,当我使用cd Desktop/epubs时,我会返回并接受所有答案,然后按enter键。路径正确,我在上面的脚本上尝试sh test.sh。我返回三个错误。两个是:notfound:debug.sh:和另一个是debug.sh 6:debug.sh:语法错误:word unexpected),预期为“do”)。该消息也显示在我上面的旧脚本中。sh
和bash
是两个不同的脚本