【问题标题】:how to calculate the minimum of two variables simply in bash?如何在bash中简单地计算两个变量的最小值?
【发布时间】:2023-04-03 22:43:02
【问题描述】:

我有一个 bash 脚本检查平台上的 CPU 数量,以有效地使用 -j 选项进行 make、repo 等。我使用这个:

JOBS=$(cat /proc/cpuinfo | grep processor | tail -1 | sed "s,^.*:.*\([0-9].*\)$,\1,")
echo -e "4\n$JOBS" | sort -r | tail -1

它工作正常。但是,我想知道是否有任何内置函数可以做同样的事情(即计算最小值或最大值)?

【问题讨论】:

  • 与您的问题无关,但是您的cat 管道应该做什么?似乎grep ^processor /proc/cpuinfo | sed -n -e '$s/.*://p' 会同样有效。
  • 关于“多少核心”管道的另一个注意事项:由于您想知道系统中有多少核心可用,您不必确定“最高处理器编号是多少” ,但实际上更安全、更简单的方法是,count 它们:grep ^processor /proc/cpuinfo | wc -l.
  • 只使用nproc 怎么样?

标签: bash logical-operators


【解决方案1】:

如果你想得到MAX(4,$JOBS),使用这个:

echo $((JOBS>4 ? JOBS : 4))

【讨论】:

  • 我的意思是分钟,但是是的,感谢您的回答! echo $(($JOBS<4?$JOBS:4))
  • 谢谢,不知道$(( ))支持三元运算符。很有用。如果需要,您可以省略其中的 $s:$((JOBS > 4 ? JOBS : 4))
  • @Anonymous Bash 不支持任何本机方式的浮点数,因此您必须使用像 bc 这样的非便携式解决方案,或者做一些巧妙的技巧,比如分离 int/decimal 部分和分别比较。
  • 我假设这个解决方案是 Bash 原生的。一些扩展它为什么起作用,或者外壳扩展的含义(或任何它)会很棒。
  • 这是一个非常简单的例子,通常被称为“三元运算符”,存在于许多编程语言中,只需 google 即可。
【解决方案2】:

有类似的情况,我必须从 几个 变量中找出最小值,而我发现有用的另一种解决方案是 sort

#!/bin/bash

min_number() {
    printf "%s\n" "$@" | sort -g | head -n1
}

v1=3
v2=2
v3=5
v4=1

min="$(min_number $v1 $v2 $v3 $v4)"

我想这不是最有效的技巧,但对于少量的常量变量来说,它应该没多大关系 - 而且它比嵌套三元运算符更具可读性。


编辑:引用 Nick 的精彩评论 - 此方法可以扩展到任何类型的排序用法:

#!/bin/bash

min() {
    printf "%s\n" "${@:2}" | sort "$1" | head -n1
}
max() {
    # using sort's -r (reverse) option - using tail instead of head is also possible
    min ${1}r ${@:2}
}

min -g 3 2 5 1
max -g 1.5 5.2 2.5 1.2 5.7
min -h 25M 13G 99K 1098M
max -d "Lorem" "ipsum" "dolor" "sit" "amet"
min -M "OCT" "APR" "SEP" "FEB" "JUL"

【讨论】:

    猜你喜欢
    • 2022-12-17
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    相关资源
    最近更新 更多