如何在bash中简单地计算两个变量的最小值?

m-r*_*ric 46 bash logical-operators

我有一个bash脚本检查平台上的CPU数量,以有效地使用-jmake,repo等选项.我使用这个:

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

它工作正常.但是,我想知道是否有任何内置函数执行相同的操作(即计算最小值或最大值)?

mvd*_*vds 99

如果你想要获得MAX(4,$JOBS),请使用:

echo $((JOBS>4 ? JOBS : 4))
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我不知道`$(())`支持三元运算符.很有用.你可以省略`$`里面的内容:`$((JOBS> 4?JOBS:4))` (18认同)
  • 我的意思是分钟,但是,谢谢你的回答!`echo $(($ JOBS <4?$ JOBS:4))` (4认同)

Arn*_*lca 24

有一个类似的情况,我必须找到几个变量中的最小值,并且我发现有用的有点不同的解决方案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)"
Run Code Online (Sandbox Code Playgroud)

我想这不是最有效的技巧,但对于一个小的常数变量,它应该没什么关系 - 并且它比嵌套三元运算符更具可读性.


编辑:引用尼克的好评 - 这种方法可以扩展到任何类型的排序用法:

#!/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"
Run Code Online (Sandbox Code Playgroud)

  • 此策略还可以处理浮点数、字母、单词或任何其他可排序的内容,例如。具有人类可读单位的数字:`printf "%s\n" 25M 13G 99K 1098M|sort -h|head -n1` (3认同)