如何将其用作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