bash - 我在 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 个文件,不包括 . 和..然后它的数字翻了一番。
非常感谢您的帮助!
解决方案
$((++dirs))
扩展为一个数字,然后作为命令执行,因此错误1: command not found
.
要在++dir
不扩展结果的情况下执行,请使用((++dir))
不带$
. 对++files
.
它的计数达到 48 个命令未找到,但有 22 个文件
然后您的文件名包含空格或特殊符号,如*[]?
. 请参阅为什么不应该解析 ls 的输出。
通过使用 glob 而不是ls
. 此外,对于数组或计算其参数的函数,循环不是必需的。
#! /bin/bash
count() { echo $#; }
total=$(count *)
dirs=$(count */)
((files=total-dirs))
推荐阅读
- excel - 使用 excel vba 计算每行中的重复值和报告重复数
- java - 运行junit测试时找不到lombok getter
- react-native - React Native 中的慢发布请求
- reactjs - HTML 表格单元格内边距
- google-app-engine - 应用引擎无法通过云 nat 静态 IP 地址重定向流量
- python - 使用字典创建菜单
- json - 用 jq 查找元素的索引
- python - 熊猫滚动窗口等级顺序有条件
- firebase - 在有效负载中接收带有 Firebase 的 OAuth 不记名令牌
- javascript - React Native:我可以将项目添加到另一个屏幕中的平面列表中吗?