Ответ 1
Если вы хотите получить MAX(4,$JOBS)
, используйте это:
echo $((JOBS>4 ? JOBS : 4))
У меня есть скрипт bash, проверяющий количество процессоров на платформе для эффективного использования -j
для make, repo и т.д. Я использую это:
JOBS=$(cat /proc/cpuinfo | grep processor | tail -1 | sed "s,^.*:.*\([0-9].*\)$,\1,")
echo -e "4\n$JOBS" | sort -r | tail -1
Работает нормально. Но мне интересно, была ли какая-либо встроенная функция, которая делает то же самое (то есть вычисляет минимум или максимум)?
Если вы хотите получить MAX(4,$JOBS)
, используйте это:
echo $((JOBS>4 ? JOBS : 4))
Была похожая ситуация, когда мне пришлось найти минимум из нескольких переменных, а несколько другое решение, которое я нашел полезным, было 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 -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"