2012-05-02 13 views
32

私はこれを使用...、bashスクリプトを効率的に作るために-jオプションを使用するプラットフォーム上でCPUの数をチェックレポを持っている:bashで2つの変数の最小値を計算する方法は?

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

それは素晴らしい、正常に動作します。しかし、私は、それを行う組み込み関数があるかどうか、つまり最小値または最大値を計算しているかどうか疑問に思っていますか?

+2

が、何あなたの 'cat'パイプラインがあることを想定していますやっている?それは 'grep^processor/proc/cpuinfo | sed -n -e '$ s /.*://p''と同じ効果があります。 – Sorpigal

+0

あなたは正しいです、ありがとう。 –

答えて

76

あなたがMAX(4,$JOBS)を取得することを意味している場合、この使用:

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

私は分を意味しましたが、はい、あなたの答えに感謝します! ($ JOBS <4?$ JOBS:4)) ' –

+12

ありがとう、私は' $(()) 'が三項演算子をサポートしていないことを知りました。非常に便利。必要ならば '$ 'を省略することができます:' $((JOBS> 4?JOBS:4)) ' – Tobia

+0

@mvdsどうすれば浮動小数点値で扱いますか? – Anonymous

20

は私がいくつかのの変数のうちの最小値を見つけなければならなかった似たような状況があったが、私は重宝多少異なる解決策が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)" 

私はそれが最も効率的なトリックはありませんが、変数の小さな一定の数のために、それはあまり問題ではないはず推測する - それは、ネスト三項演算子よりも読みやすいです。


EDIT:ニックの偉大なコメントを参照 - このメソッドは、ソートの使用のいずれかのタイプに拡張することができます:あなたの質問に関係のない

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

この戦略では、浮動小数点数、文字、単語、その他のソート可能なものも処理できます。 'printf"%s \ n "25M 13G 99K 1098M | sort -h | head -n1' –

関連する問題