我在 bash 中的 for 循环不计算文件和目录

时间:2021-08-01 14:02:38

标签: bash shell

我正在用 bash 编写一个小脚本来练习,我发现我的代码的语法是正确的,但我肯定遗漏了一些东西,这是我的代码:

#!/bin/bash

cfiles=$(ls | wc -l)

echo $cfiles

files=0
dirs=0

for look in $(ls); do
   [ -d look ] && $((++dirs)) || $((++files))
done

echo "Files: $files"
echo "Directories: $dirs"

我收到一条很长的错误消息和错误的输出:

22
test.sh: line 11: 1: command not found
... (until number 48)
test.sh: line 11: 48: command not found
Files: 48
Directories: 0

我的代码有什么问题?它在未找到命令的情况下达到了 48 个,但有 22 个文件不包括 .然后..然后数字翻了一番。

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

$((++dirs)) 扩展为一个数字,然后作为命令执行,因此出现错误 1: command not found

要仅执行 ++dir 而不扩展结果,请使用不带 ((++dir))$++files 也一样。

<块引用>

在没有找到命令的情况下达到了 48 个,但有 22 个文件

然后您的文件名包含空格或特殊符号,如 *[]?。见Why you shouldn't parse the output of ls

通过使用 glob 代替 ls,您可以使您的脚本更简单、更安全。此外,对于数组或对其参数进行计数的函数,循环不是必需的。

#! /bin/bash
count() { echo $#; }
total=$(count *)
dirs=$(count */)
((files=total-dirs))

答案 1 :(得分:0)

比较 shell 如何处理扩展:

$ ls -t
'this file'   file  'this directory'   directory
$ for f in $(ls) ; do echo "[$f]" ; done
[directory]
[file]
[this]
[directory]
[this]
[file]
$ for f in * ; do echo "[$f]" ; done
[directory]
[file]
[this directory]
[this file]

所以在一行中:

$ dirs=0; files=0; for f in * ; do [ -d "$f" ] && ((++dirs)) || ((++files)) ; done ; echo "d: $dirs f: $files"