2014-05-19 12 views
5

Tôi cần đếm số dòng của một biến nhất định. Ví dụ: tôi cần tìm số lượng dòng VAR có, trong đó VAR=$(git log -n 10 --format="%s").Đếm số dòng một biến bash chính xác

Tôi đã thử với echo "$VAR" | wc -l), thực sự hiệu quả, nhưng nếu VAR trống, hãy in 1, điều đó là sai. Có một cách giải quyết cho điều này? Một cái gì đó tốt hơn so với sử dụng mệnh đề if để kiểm tra xem biến có trống không ... (có thể thêm một dòng và trừ 1 từ giá trị trả về?).

+0

bạn muốn loại trừ tất cả các dòng trống hoặc chỉ khi có một dòng trống? – Kent

+0

'git log' tạo ra hoặc không có gì, hoặc một số dòng. Vì vậy, tôi cần phải xử lý trường hợp của một var trống, bởi vì sẽ không có dòng trống nếu biến không rỗng. – linkyndy

+0

Điều đó không đúng! 'git log -n 10' tạo ra các dòng trống. nhưng tôi có được những gì bạn muốn. – Kent

Trả lời

12

Số wc đếm số số ký tự dòng mới. Bạn có thể sử dụng grep -c '^' để đếm các dòng. Bạn có thể thấy sự khác biệt với:

#!/bin/bash 

count_it() { 
    echo "Variablie contains $2: ==>$1<==" 
    echo -n 'grep:'; echo -n "$1" | grep -c '^' 
    echo -n 'wc :'; echo -n "$1" | wc -l 
    echo 
} 

VAR='' 
count_it "$VAR" "empty variable" 

VAR='one line' 
count_it "$VAR" "one line without \n at the end" 

VAR='line1 
' 
count_it "$VAR" "one line with \n at the end" 

VAR='line1 
line2' 
count_it "$VAR" "two lines without \n at the end" 

VAR='line1 
line2 
' 
count_it "$VAR" "two lines with \n at the end" 

gì tạo:

Variablie contains empty variable: ==><== 
grep:0 
wc :  0 

Variablie contains one line without \n at the end: ==>one line<== 
grep:1 
wc :  0 

Variablie contains one line with \n at the end: ==>line1 
<== 
grep:1 
wc :  1 

Variablie contains two lines without \n at the end: ==>line1 
line2<== 
grep:2 
wc :  1 

Variablie contains two lines with \n at the end: ==>line1 
line2 
<== 
grep:2 
wc :  2 
+1

Đề xuất tuyệt vời bằng cách sử dụng 'grep -c '^'' cho việc này. – linkyndy

5

Bạn luôn có thể viết nó có điều kiện:

[ -n "$VAR" ] && echo "$VAR" | wc -l || echo 0 

này sẽ kiểm tra xem $VAR có nội dung và hành động phù hợp.

+0

Đó là một chút dài, đó là lý do tại sao nghĩ rằng có một số cách tốt hơn. – linkyndy

+0

Ngay sau khi nó được kỳ quặc này tôi có thể đi theo con đường an toàn và viết nó một cách rõ ràng. – nemo

1

thử:

echo "$VAR" | grep^| wc -l 
+2

:) hoặc đơn giản hơn: 'grep -c '^'' - xem câu trả lời của tôi ..;) – jm666

+0

ok, câu trả lời rất hay –

5

Đối với một giải pháp bash tinh khiết: thay vì đưa đầu ra của lệnh git vào một biến (được cho là xấu), đặt nó vào một mảng, một dòng cho mỗi trường:

mapfile -t ary < <(git log -n 10 --format="%s") 

Sau đó, bạn chỉ cần đếm số lượng các trường trong mảng ary:

echo "${#ary[@]}" 

Thiết kế này cũng sẽ làm cho cuộc sống của bạn đơn giản hơn nếu, ví dụ, bạn cần phải lấy 5 cam kết thông báo:

echo "${ary[4]}" 
+2

+1 đây là câu trả lời hay nhất. – anubhava

+1

+1 tên người dùng yêu thích của tôi trên SO –

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