我正在用 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 个文件不包括 .然后..然后数字翻了一番。
非常感谢您的帮助!
答案 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"