首页 > 解决方案 > 我在 bash 中的 for 循环不计算文件和目录

问题描述

我正在用 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 个文件,不包括 . 和..然后它的数字翻了一番。

非常感谢您的帮助!

标签: bashshell

解决方案


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

要在++dir不扩展结果的情况下执行,请使用((++dir))不带$. 对++files.

它的计数达到 48 个命令未找到,但有 22 个文件

然后您的文件名包含空格或特殊符号,如*[]?. 请参阅为什么不应该解析 ls 的输出

通过使用 glob 而不是ls. 此外,对于数组或计算其参数的函数,循环不是必需的。

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

推荐阅读