【发布时间】:2019-08-01 15:17:58
【问题描述】:
我在使用管道输出时遇到问题,例如
ls *.gz | wc -l / 2 | bc
立即作为 bc 等 shell 计算器工具的输入。我不确定如何加上引号,或者如果不分配变量这是否可能?
背景是文件夹中每个两个文件都属于一起,所以我只想将文件总数除以2。
可能有一个明显的解决方案,但到目前为止我找不到它......
如果这很重要,我正在使用bash?
【问题讨论】:
-
仅供参考,解析
ls不是计算文件的好方法(或做几乎任何其他事情)。shopt -s nullglob; files=( *.gz ); bc <<<"${#files[@]} / 2"-- 见ParsingLs。 -
也就是说,如果你只是在做整数除法,为什么要使用
bc?echo "$(( ${#files[@]} / 2 ))"仅使用 bash 内置数学。 -
见BashFAQ #4,它直接用于计数文件,BashFAQ #22,用于浮点数学。
-
printf '%s\0' *.gz | tr -cd '\0' | wc -c避免让文件名影响结果(因此您不能拥有不会转义文字换行符的ls版本会导致使用touch $'foo\nbar'创建的文件被计算两次),但它引入了一个错误,即如果有 no*.gz文件,您仍然会得到 1 的结果。关于变量的具体问题是什么?如果需要释放它们,请考虑:countFiles() { if [[ -e $1 || -L $1 ]]; then echo "$#"; else echo 0; fi; }; countFiles *.gz- 那么您的内存存储在堆栈上,并自动释放。 -
re: shell-native 算术,顺便说一句,见wiki.bash-hackers.org/syntax/arith_expr