web-dev-qa-db-ja.com

単純にbashで2つの変数の最小値を計算する方法は?

プラットフォーム上のCPUの数を確認するbashスクリプトがあり、-jメイク、レポなどのオプション。これを使用します。

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

正常に動作します。しかし、私は同じことを行う組み込み関数があるのだろうかと思っています(つまり、最小値または最大値を計算します)?

45
m-ric

MAX(4,$JOBS)を取得する場合は、これを使用します。

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

複数変数から最小値を見つけなければならない同様の状況があり、多少異なる解決策が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)"

私はそれが最も効率的なトリックではないと思いますが、変数の定数が少ない場合、それは大した問題ではないはずです-それは三項演算子をネストするよりも読みやすいです。


[〜#〜] 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"
23
Arnon Zilca