![使用 for 循环计算当前目录中每个文件的行数?](https://linux22.com/image/102749/%E4%BD%BF%E7%94%A8%20for%20%E5%BE%AA%E7%8E%AF%E8%AE%A1%E7%AE%97%E5%BD%93%E5%89%8D%E7%9B%AE%E5%BD%95%E4%B8%AD%E6%AF%8F%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E8%A1%8C%E6%95%B0%EF%BC%9F.png)
- 如果提供参数作为输入,脚本应仅检查该输入文件的行数,否则脚本应显示该目录中每个文件的行数。
- 应忽略脚本文件,即不应显示脚本文件的计数。
我试过:
#!/bin/bash
if [ $# -eq 0 ]
then
for l in *.txt
do
echo $(wc -l $l)
done
else
for l in $*
do
echo $(wc -l $l)
done
fi
但我不允许明确提及文件类型,即 *.txt - 它必须检查除脚本文件之外的所有文件。
答案1
我想你差不多明白了。您可以basename "$0"
使用从脚本中查找脚本的名称,并打印除以下内容之外的所有内容的行数
#!/bin/bash
if [ $# -eq 0 ]
then
for k in *
do
if [[ ! -d "$k" && "$k" != `basename "$0"` ]]
then
wc -l "$k"
fi
done
else
for k in $*
do
wc -l "$k"
done
fi
我冒昧地
- 使用
k
代替l
(不推荐用于变量名,我很确定,尽管我找不到链接(它可能与1
,混淆I
)) - 使用 4 个空格而不是 8 个空格进行缩进。最后这当然是你的决定,但我想说 4 个空格比 8 个更具可读性。
- 引用你的变量。强烈建议避免用空格分割变量名称。
echo
像@Serg 指出的那样,删除不必要的内容。
编辑我添加了双括号和目录测试以忽略它们以及if
条件。
答案2
#!/bin/bash
if [[ "$#" != 0 ]]; then
# only process the names given to us
wc -l "$@"
exit
fi
# process all regular files in this directory, avoiding this script
for f in ./*; do
if [[ "$f" != "$0" ]] && [[ -f "$f" ]]; then
wc -l "$f"
fi
done
答案3
除了脚本之外,您还可以将三 (3) 个命令组合在一行中并打印您想要的结果。
例如。
find . -maxdepth 1 -type f -name "*.txt" -exec cat {} + | wc -l
如果您不想只在当前目录中搜索,但又想递归地计算行数,则可以删除“-maxdepth 1”开关或根据需要更改数字。