2009-09-01 30 views
12

Kịch bản lệnh trình bày bên dưới sẽ hiển thị cảnh báo nếu trang mất hơn 6 giây để tải. Vấn đề là biến số myduration không phải là số nguyên. Làm thế nào để chuyển đổi nó thành số nguyên?Biến đổi dấu chấm động thành số nguyên?

myduration=$(curl http://192.168.50.1/mantisbt/view.php?id=1 -w %{time_total}) > /dev/null ; \ 
[[ $myduration -gt 1 ]] && echo "`date +'%y%m%d%H%M%S' 

Phải mất hơn 6 giây để tải trang http://192.168.50.1/mantisbt/view.php?id=1

Trả lời

18

Giả sử $ myduration là một số thập phân hoặc số nguyên

$ myduration=6.5 
$ myduration=$(printf "%.0f" $myduration) 
$ echo $myduration 
6 
1

Nó không hoàn toàn rõ ràng, nhưng tôi nghĩ bạn đang yêu cầu làm thế nào để chuyển đổi một giá trị dấu chấm động (myduration) để một số nguyên trong bash. Một cái gì đó như thế này có thể giúp bạn, tùy thuộc vào cách bạn muốn làm tròn số của bạn.

#!/bin/bash 

floor_val= 
ceil_val= 

function floor() { 
    float_in=$1 
    floor_val=${float_in/.*} 
} 

function ceiling() { 
    float_in=$1 
    ceil_val=${float_in/.*} 
    ceil_val=$((ceil_val+1)) 
} 


float_val=$1 
echo Passed in: $float_val 
floor $float_val 
ceiling $float_val 

echo Result of floor: $floor_val 
echo Result of ceiling: $ceil_val 

Ví dụ sử dụng:

$ ./int.sh 12.345 
Passed in: 12.345 
Result of floor: 12 
Result of ceiling: 13 
+0

chức năng trần thực sự sai khi ./int.sh 12.0 sẽ trả về 13.0, trong đó nó phải trả về 12 theo định nghĩa của hàm trần (số nguyên nhỏ nhất không nhỏ hơn x) – dm76

+0

@ dm76 - Có, trường hợp cạnh đó là điểm tốt. –

2

Loại bỏ nội dung trang từ biến:

Khi tôi cố gắng lệnh của bạn, myduration chứa các nội dung HTML của trang tại URL tôi được sử dụng trong thử nghiệm của tôi cộng với giá trị thời gian. Bằng cách thêm -s để chặn thanh tiến trình và thêm -o /dev/null vào các tùy chọn cho curl, tôi có thể xóa chuyển hướng đến /dev/null và chỉ có thời gian được lưu trong myduration.

Kể từ khi giá trị của myduration có khả năng là ngắn, bạn có thể sử dụng kỹ thuật này ire_and_curses chương trình thường sẽ mang lại không như kết quả của nó mà sẽ ít hơn so với 1 bạn đang thử nghiệm cho (lưu ý rằng thông điệp đăng nhập của bạn nói "6 giây", mặc dù).

Finer độ phân giải:

Nếu bạn muốn có một bài kiểm tra độ phân giải tốt hơn, bạn có thể nhân myduration 1000 sử dụng một kỹ thuật như thế này:

mult1000() { 
    local floor=${1%.*} 
    [[ $floor = "0" ]] && floor='' 
    local frac='0000' 
    [[ $floor != $1 ]] && frac=${1#*.}$frac 
    echo ${floor}${frac:0:3} 
} 

Edit: Phiên bản này của mult1000 xử lý đúng các giá trị như "0.234", "1", "2.", "3.5" và "6.789". Đối với các giá trị có nhiều hơn ba chữ số thập phân, các chữ số bổ sung được cắt ngắn mà không làm tròn bất kể giá trị ("1.1119" trở thành "1.111").

Kịch bản của bạn với những thay đổi tôi đã đề cập ở trên và sử dụng mult1000 (với thời gian ví dụ của riêng tôi):

myduration=$(curl -s -o /dev/null http://192.168.50.1/mantisbt/view.php?id=1 -w %{time_total}); [[ $(mult1000 $myduration) -gt 3500 ]] && echo "`date +'%y%m%d%H%M%S'` took more than 3.5 seconds to load the page http://192.168.50.1/mantisbt/view.php?id=1 " >> /home/shantanu/speed_report.txt 

Ở đây nó được chia thành nhiều dòng (và đơn giản) để làm cho nó dễ đọc hơn ở đây trong câu trả lời này :

myduration=$(curl -s -o /dev/null http://example.com -w %{time_total}) 
[[ $(mult1000 $myduration) -gt 3500 ]] && 
    echo "It took more than 3.5 seconds to load thttp://example.com" >> report.txt 
+0

Chức năng mult1000 đó gây hiểu nhầm nghiêm trọng: $ (mult1000 1.2)! = "1200". –

+0

Nó có thể có thể sử dụng một tên tốt hơn, nhưng nó hoạt động với 'mult1000 1.200' như tôi đã chỉ ra trong nhận xét của tôi về số không. Nếu đó là cần thiết, nó dễ dàng, đủ để làm cho nó làm việc với ví dụ của bạn. –

+0

Chức năng đơn giản của tôi cũng không xử lý đúng các giá trị nhỏ hơn một, chẳng hạn như "0.234" –

1

Bạn có thể thực hiện việc này:

float=1.23 
int=${float%.*} 

Tôi đang sử dụng tính năng này trên bash.

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