Cách thêm biến số học trong tập lệnh


26

Tôi muốn tích lũy kích thước dòng của một số tệp có trong một thư mục. Tôi đã viết kịch bản sau đây:

let a=0
let num=0
for i in folder/*
do
        num=`cat $i | wc -l`
        a=$a+$num
done
echo $a

Những gì tôi nhận được ở cuối tập lệnh là 123 + 234 + 432 + ... và không phải là kết quả của phép toán số học bổ sung.

Câu trả lời:


50

Cú pháp đánh giá số học của bạn là sai. Sử dụng bất kỳ thao tác nào sau đây (lần đầu tiên cực kỳ di động nhưng chậm, lần thứ hai là POSIX và di động ngoại trừ vỏ Bourne và các phiên bản trước đó của vỏ Almquist, ba yêu cầu cuối cùng ksh, bashhoặc zsh):

a=`expr "$a" + "$num"`

a=$(($a+$num))

((a=a+num))

let a=a+num

((a+=num))

Hoặc bạn có thể bỏ qua toàn bộ forvòng lặp và chỉ cần làm:

wc -l folder/*

Hoặc, nếu bạn chỉ muốn tổng số:

cat folder/* | wc -l

Hoặc với zsh và mult_iostùy chọn của nó :

wc -l < folder/*

Không cần $bên trong ((...)). a=$((a+num))đã ổn rồi
Weijun Zhou

nếu một biến không được đặt hoặc có giá trị null, thì nó sẽ hoạt động, nếu không có cách nào khác để xử lý nó.
Bharat

7

bạn cũng có thể sử dụng mã này

    a=`expr $a + $num`
    echo $a

KIẾM ĐƯỢC RATNG ĐÓ LÀ MỘT KHÔNG GIAN TRÊN CẢ HAI MẮT + IN "$ a + $ num"


luôn luôn cung cấp không gian cho cả hai phía của toán tử khi sử dụng lệnh expr để tính toán.
dùng1678213

2

Bạn có thể khai báo loại biến trước:

    declare -i a=0
    declare -i num=0

1

Xin lỗi, chỉnh sửa trước đó là cho một bài viết khác. Ở đây, chỉ là một sửa đổi nhỏ cho kịch bản gốc:

để a = 0
hãy để num = 0
cho tôi trong thư mục / *
làm
        num = `mèo $ i | wc -l`
        a = $ (tiếng vang $ a + $ num | bc)
làm xong
tiếng vang $ a

1
Bỏ phiếu xuống, vì câu trả lời không xuất hiện để giải quyết câu hỏi.
Time4Tea

Xin lỗi các bạn, giờ đã sửa
Leo

1

Câu trả lời cần xác định trong đó shell nào là mã hợp lệ. Chẳng hạn, trong bourne Shell ( sh) chỉ các hướng dẫn sau là hợp lệ:

a=$((a+num))
a=$(($a+$num))

trong khi các khả năng khác được liệt kê bởi @manatwork có thể hợp lệ trong bourne again shell ( bash)


-1

tôi làm nó như thế này

MY_VARIABLE=$((num1+num2))

3
Điều này không thêm gì vào những gì đã được nói.
Kusalananda

1
đó là câu trả lời ngắn gọn
HHR Badawi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.