web-dev-qa-db-fra.com

comment calculer le minimum de deux variables simplement en bash?

J'ai un script bash vérifiant le nombre de processeurs sur la plate-forme pour utiliser efficacement -j option pour make, repo, etc. J'utilise ceci:

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

Ça fonctionne bien. Mais, je me demande s'il y avait une fonction intégrée qui fait la même chose (c'est-à-dire calculer le minimum ou le maximum)?

45
m-ric

Si vous voulez obtenir MAX(4,$JOBS), utilisez ceci:

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

Avait une situation similaire où je devais trouver le minimum de plusieurs variables, et une solution quelque peu différente que j'ai trouvée utile était 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)"

Je suppose que ce n'est pas l'astuce la plus efficace, mais pour un petit nombre constant de variables, cela ne devrait pas avoir beaucoup d'importance - et c'est plus lisible que l'imbrication des opérateurs ternaires.


MODIFIER : référence au grand commentaire de Nick - cette méthode peut être étendue à tout type d'utilisation de tri:

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