2012-05-02 16 views
32

Mam skrypt bash sprawdzenie liczby procesorów na platformie do efektywnego wykorzystania opcji -j dla make, repo, ... Używam tego:jak obliczyć minimum dwóch zmiennych po prostu w bash?

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

To działa dobrze, świetnie. Ale zastanawiam się, czy istnieje wbudowana funkcja, która właśnie to, czyli obliczenie minimum lub maksimum?

+2

niezwiązane z pytaniem, ale jaki jest twój 'rurociąg cat' miało być robić? Wydaje się, że jest to 'grep^processor/proc/cpuinfo | sed -n -e '$ s /.*: // p'' będzie równie efektywne. – Sorpigal

+0

Masz rację, dzięki. –

Odpowiedz

76

Jeśli masz na myśli, aby uzyskać MAX(4,$JOBS), użyj tego:

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

Miałem na myśli min, ale tak, dziękuję za odpowiedź! 'echo $ (($ ZADANIA <4? $ ZALICZKI: 4))' –

+12

Dzięki, nie wiedziałem '$ (())' obsługiwane przez operatora potrójnego. Bardzo przydatne. Możesz pominąć '$' s w środku, jeśli chcesz: '$ ((JOBS> 4? JOBS: 4))' – Tobia

+0

@mvds, jak zrobiłbyś to na wartościach zmiennoprzecinkowych? – Anonymous

20

Miałem podobną sytuację, gdzie miałem się znaleźć minimum Spośród kilku zmiennych i nieco inne rozwiązanie znalazłem przydatny był 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)" 

Myślę, że to nie jest najskuteczniejsza sztuczka, ale dla małej stałej liczby zmiennych, nie powinno to mieć większego znaczenia - i jest bardziej czytelne niż zagnieżdżanie potrójnych operatorów.


EDIT: Odnosząc się wielką komentarz Nicka - metoda ta może być rozszerzona do każdego rodzaju użytkowania sortowania:

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

Ta strategia może również obsługiwać liczby zmiennoprzecinkowe, litery, słowa lub cokolwiek innego, które można sortować, np. liczby z ludzkimi czytelnymi jednostkami: 'printf"% s \ n "25M 13G 99K 1098M | sort -h | head -n1' –

Powiązane problemy