2012-01-16 35 views
5

Tôi đã tạo tập lệnh shell tìm kích thước của một thư mục, trả về ở định dạng có thể đọc được của con người (ví dụ: 802M hoặc 702K). Tôi muốn tính toán sự khác biệt giữa các kích thước.Chuỗi trừ (là số) trong tập lệnh shell

Dưới đây là shell script của tôi cho đến nay:

#!/bin/bash 

current_remote_dir_size=789M 
new_remote_dir_size=802M 
new_size=`echo ${new_remote_dir_size} | grep -o [0-9]*` 
current_size=`echo ${current_remote_dir_size} | grep -o [0-9]*` 

echo "${new_size}-${current_size}" 

Nhưng đầu ra của kịch bản chỉ là

- 

Làm thế nào tôi có thể làm công việc trừ?

Trả lời

11

Bạn có thể thực hiện phép toán số nguyên cơ bản bằng bash bằng cách gói biểu thức trong $(()).

$ echo $((5 + 8)) 
13 

Trong trường hợp cụ thể của bạn, các công việc sau cho tôi:

$ echo "${new_size}-${current_size}" 
802-789 
$ echo $((${new_size}-${current_size})) 
13 

đầu ra của bạn ở cuối là một chút kỳ quặc. Kiểm tra xem biểu thức grep có thực sự tạo ra kết quả mong muốn hay không. Nếu không, bạn có thể cần phải quấn cụm từ thông dụng trong dấu ngoặc kép.

+0

Hmm, tôi vẫn gặp lỗi. Tôi đã thay đổi dòng cuối cùng thành 'echo $ (($ {new_size} - $ {current_size}))', nhưng sau đó tôi nhận được một lỗi toán hạng. –

+0

@mr_schlomo Nó hoạt động trên hệ thống của tôi. Xem bài viết đã chỉnh sửa của tôi. Đảm bảo 'grep' thực sự hoạt động như bạn mong đợi. –

+0

Rất tiếc! Yep, 'grep' là vấn đề. Tôi chỉ chạy kịch bản của tôi trên máy chủ Linux của tôi và nó đã hoạt động! –

1

Bạn không cần phải gọi ra để grep dải chữ từ dây của bạn:

current_remote_dir_size=789M 
current_size=${current_remote_dir_size%[A-Z]} 
echo $current_size # ==> 789 

new_remote_dir_size=802M 
new_size=${new_remote_dir_size%[A-Z]} 
echo $new_size  # ==> 802 

Xem Shell Parameter Expansion trong cuốn hướng dẫn bash.

+0

Nhưng điều này sẽ âm thầm trừ 802k-789M. :) –

1

Tất cả bạn cần là:

echo $((${new_remote_dir_size/M/}-${current_remote_dir_size/M/})) 
  • $ ((a + b - 4)) có thể được sử dụng cho số học biểu thức
  • $ {string/M /} thay thế M trong chuỗi với không có gì . Xem man bash, Thay thế chuỗi mục, để biết thêm chi tiết và khả năng.
+0

Tôi gặp lỗi thay thế với điều này. –

+0

Làm thế nào để bạn gọi nó? –

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