2012-05-02 18 views
32

Tôi có một kịch bản bash kiểm tra số lượng cpu trên nền tảng này để sử dụng một cách hiệu quả -j lựa chọn cho thực hiện, repo, ... Tôi sử dụng này:làm thế nào để tính toán tối thiểu của hai biến chỉ đơn giản là trong bash?

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

Nó hoạt động tốt, tuyệt vời. Nhưng tôi tự hỏi nếu có bất kỳ chức năng được xây dựng trong đó chỉ có điều đó, tức là tính toán tối thiểu, hoặc tối đa?

+2

Không liên quan đến câu hỏi của bạn, nhưng 'đường ống cat' bạn cho là là những gì đang làm? Nó có vẻ như 'grep^processor/proc/cpuinfo | sed -n -e '$ s /.*: // p'' sẽ có hiệu quả. – Sorpigal

+0

Bạn nói đúng, cảm ơn. –

Trả lời

76

Nếu bạn có nghĩa là để có được MAX(4,$JOBS), sử dụng này:

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

Tôi có nghĩa là min, nhưng có, cảm ơn câu trả lời của bạn! 'echo $ (($ JOBS <4? $ JOBS: 4))' –

+12

Cảm ơn, tôi không biết '$ (())' đã hỗ trợ toán tử bậc ba. Rất hữu dụng. Bạn có thể bỏ qua '$' s bên trong nó, nếu bạn muốn: '$ ((JOBS> 4? JOBS: 4))' – Tobia

+0

@mvds, bạn sẽ làm như thế nào trên các giá trị dấu chấm động? – Anonymous

20

Đã có một tình huống tương tự mà tôi đã phải tìm ra tối thiểu ra khỏi nhiều biến, và một giải pháp hơi khác tôi thấy hữu ích là 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)" 

Tôi đoán Đó không phải là thủ thuật hiệu quả nhất, nhưng với số lượng biến không đổi, nó không quan trọng lắm - và dễ đọc hơn các toán tử lồng nhau.


EDIT: Nhắc bình luận vĩ đại của Nick - Phương pháp này có thể được mở rộng cho bất kỳ loại hình sử dụng loại:

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

Chiến lược này cũng có thể xử lý số dấu chấm động, chữ cái, từ hoặc bất kỳ thứ gì khác có thể sắp xếp, ví dụ: số với các đơn vị có thể đọc được của con người: 'printf '% s \ n" 25M 13G 99K 1098M | sắp xếp -h | đầu -n1' –

Các vấn đề liên quan