循环中计算文件命令数

循环中计算文件命令数

如何将其用作ls *.txt | wc单独的变量,以便之后可以在循环中使用它?那是

count.files=$(ls *.txt | wc)
...

if count.files -ne 2000; then
echo "message"
fi

我已经尝试过,但似乎不起作用。

答案1

您的代码中有几个错误:

  • 在大多数 shell 中,变量名不能包含点
  • 你需要wc-l旗帜打电话
  • 你需要ls-d旗帜打电话
  • 您需要标记选项的结尾--或使用./前缀ls
  • 你的if测试错过了括号(但也许这只是堆栈交换格式)
  • 如果文件名包含换行符,则该方法不起作用
  • 省略隐藏文件。

这是一个更好的工作示例:

file_count=$(ls -d ./*.txt | wc -l)
if [ $file_count -ne 2000 ]; then echo "message"; fi

答案2

我认为您正在考虑的功能是学科。这是一个ksh93唯一的功能:

function count.get {
  .sh.value=$(set -- ~(N)*.txt; echo "$#")
}

然后,每当$count展开时,纪律调用函数并为其赋值。

在 中zsh,您还可以将变量的内容定义为代码:

count='$(set -- *.txt(N); echo "$#")'

并将其用作扩展时${(e)count}要评估的代码e

然而,与使用函数的标准方法相比,这些方法几乎没有什么好处:

count() (
  set -- [*].txt *.txt
  case $1$2 in
    '[*].txt*.txt') echo 0;;
    *) echo "$#"
  esac
)

(使用支持 nullglob 选项(如上面的's或's )[*]的 shell 可以避免这个技巧)。ksh93~(N)zsh(N)

并将其用作$(count)(命令替换)。

(有关您的代码的所有问题,请参阅其他答案)。

答案3

首先,您需要使用wc -l仅计算换行符。这应该有效:

#!
filecounter=$(ls *.txt | wc -l)
if [ $filecounter -ne 2000 ]; then echo "message"
fi

相关内容