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

如何在bash中简单地计算两个变量的最小值?,bash,logical-operators,Bash,Logical Operators,我有一个bash脚本,用于检查平台上的CPU数量,以便有效地使用make、repo等的-j选项。我使用此脚本: JOBS=$(cat /proc/cpuinfo | grep processor | tail -1 | sed "s,^.*:.*\([0-9].*\)$,\1,") echo -e "4\n$JOBS" | sort -r | tail -1 echo $((JOBS>4 ? JOBS : 4)) 它很好用。但是,我想知道是否有任何内置函数可以执行相同的操作(即计算最小

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

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

它很好用。但是,我想知道是否有任何内置函数可以执行相同的操作(即计算最小值或最大值)

如果您想获得
MAX(4$JOBS)
,请使用以下命令:

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

有一个类似的情况,我必须从几个变量中找出最小值,我发现一个稍微不同的解决方案是
排序

#!/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"

与您的问题无关,但您的
cat
管道应该做什么?似乎
grep^processor/proc/cpuinfo | sed-n-e'$s/*://p'
也同样有效。关于“多少核”管道的另一个注意事项是:由于您想知道系统中有多少核可用,您不必确定“最高处理器数是多少”,但实际上更安全、更简单的方法是,好的,数一数:
grep^processor/proc/cpuinfo|wc-l
。使用
nproc
怎么样?我是说分钟,但是是的,谢谢你的回答
echo$($JOBSThanks,我不知道
$(())
支持三元运算符。非常有用。如果需要,可以省略其中的
$
s:
$((作业>4?作业:4))
@Anonymous Bash不支持任何本机方式的浮点运算,因此您必须使用不可移植的解决方案,如
bc
,或者进行一些巧妙的破解,如将int/decimal部分分开并分别进行比较。我假设此解决方案是Bash本机解决方案。一些人对它的工作原理或shell扩展的含义进行了一些扩展(或不管它是什么)会很好。这是一个通常被称为“三元运算符”的非常简单的例子,出现在许多编程语言中,只要用谷歌搜索一下就可以了。这个策略还可以处理浮点数、字母、单词或任何其他可排序的东西,例如具有人类可读单位的数字:
printf“%s\n”25M 13G 99K 1098M |分拣-h |封头-n1