2012-05-02 9 views
32

que tienen una escritura del golpe de comprobar el número de CPU en la plataforma para utilizar de manera eficiente opción -j para el maquillaje, repo, ... Puedo usar este:cómo calcular el mínimo de dos variables simplemente en bash?

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

Trabaja muy bien, muy bien. Pero me pregunto si hubo alguna función incorporada que hace precisamente eso, es decir, ¿calculando el mínimo o el máximo?

+2

Sin relación con su pregunta, pero ¿cuál es su 'tubería cat' supone que es ¿obra? Parece que 'grep^processor/proc/cpuinfo | sed -n-e '$ s /.*: // p'' sería igual de efectivo. – Sorpigal

+0

Tienes razón, gracias. –

Respuesta

76

Si se refiere a conseguir MAX(4,$JOBS), utilice esto:

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

Quise decir el mínimo, pero sí, ¡gracias por tu respuesta! 'echo $ (($ JOBS <4? $ JOBS: 4))' –

+12

Gracias, no sabía '$ (())' compatible con el operador ternario. Muy útil. Puedes omitir los '$' s dentro de él, si quieres: '$ ((JOBS> 4? JOBS: 4))' – Tobia

+0

@mvds, ¿cómo lo harías en los valores de coma flotante? – Anonymous

20

Tenía una situación similar en el que tuve que encontrar el mínimo de varios las variables, y una solución un tanto diferente que encontré útil fue sort

#!/bin/bash 

min_number() { 
    printf "%s\n" "[email protected]" | sort -g | head -n1 
} 

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

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

Supongo que no es el truco más eficiente, pero para un pequeño número constante de variables, no debería importar mucho, y es más fácil de leer que los operadores ternarios de anidación.


EDITAR: Refiriéndose gran comentario de Nick - este método se puede ampliar a cualquier tipo de uso para ordenar:

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

Esta estrategia también puede manejar números en coma flotante, letras, palabras o cualquier otra cosa ordenable, ej. números con unidades legibles por humanos: 'printf"% s \ n "25M 13G 99K 1098M | ordenar -h | head -n1' –

Cuestiones relacionadas