【问题标题】:use shell pipe output as calculator input使用壳管输出作为计算器输入
【发布时间】: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
  • 也就是说,如果你只是在做整数除法,为什么要使用bcecho "$(( ${#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

标签: shell unix bc


【解决方案1】:

正如查尔斯所说,解析 ls 不是一个好习惯,但无论如何,如果你想这样做,你可以尝试

 ls *.gz |wc -l | xargs echo "0.5*" | bc

【讨论】:

    猜你喜欢
    • 2017-05-13
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多