2012-05-01 35 views
8

Làm cách nào để thay đổi biến này?Thay đổi các biến trong bash

max=0; 
min=20000000; 
cat |while read 
do 
    read a 
    if [[ $a -gt $max ]] 
    then 
     max=a` 
    fi 
    `if [[ $a -lt $min ]] 
    then 
     min=a 
    fi 
done 
echo $max 
echo $min 

Tối thiểu và tối đa của tôi vẫn giữ nguyên, 0 và 2000000. Ai có thể giúp tôi với điều này? Tôi không có ý kiến.

+0

Đối với những người trong chúng ta ai đã bỏ lỡ câu hỏi trước của bạn, bạn có thể cung cấp thêm thông tin cho câu hỏi này không. Bạn đang cố gắng thay đổi gì? –

+3

cũng 'max = a' phải là' max = $ a', cùng với 'min = a' phải là' min = $ a' –

+0

Cái gì sẽ là 'min' nếu mọi giá trị lớn hơn 20000000? Tôi đoán rằng 'min' và' max' phải là giá trị đầu tiên của bạn ... –

Trả lời

13

Vấn đề (chính) với tập lệnh của bạn là thiết lập minmax xảy ra trong một vỏ con chứ không phải vỏ chính của bạn. Vì vậy, các thay đổi không hiển thị sau khi hoàn thành đường ống.

Một số khác là bạn đang gọi điện thoại đã đọc hai lần - điều này có thể được dự định nếu bạn muốn bỏ qua mọi dòng khác, nhưng điều đó hơi khác thường.

Điều cuối cùng là min=a đặt min thành a, theo nghĩa đen. Bạn muốn đặt nó thành $a.

Sử dụng process substitution để thoát khỏi vấn đề đầu tiên, loại bỏ (có thể) bỏ cần thiết đọc thứ hai, và sửa chữa các bài tập, mã của bạn sẽ giống như thế:

max=0 
min=20000000 
while read a 
do 
    if [[ $a -gt $max ]] 
    then 
     max=$a 
    fi 
    if [[ $a -lt $min ]] 
    then 
     min=$a 
    fi 
done < <(cat) # careful with the syntax 
echo $max 
echo $min 

+0

ahhhh Cảm ơn bây giờ tôi hiểu điều này. Cảm ơn :) – pkruk

+1

Vấn đề thứ 4: backticks không được khuyến khích ở giữa kịch bản, không giải thích được do lỗi người mới bắt đầu. :) –

+0

@userunknown: Tôi cho rằng đó là kết quả của cuộc chiến với trình chỉnh sửa markdown, không có trong mã :) – Mat

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