2014-05-19 5 views
5

मुझे किसी दिए गए चर की रेखाओं की संख्या गिनने की आवश्यकता है। उदाहरण के लिए मुझे यह पता लगाना होगा कि VAR कितनी लाइनें हैं, जहां VAR=$(git log -n 10 --format="%s") है।सही ढंग से लाइनों की संख्या को गैश वैरिएबल

मैंने echo "$VAR" | wc -l) के साथ प्रयास किया, जो वास्तव में काम करता है, लेकिन यदि VAR खाली है, तो प्रिंट 1 है, जो गलत है। क्या इसके आसपास कोई कार्य है? if खंड का उपयोग करने के लिए कुछ बेहतर है कि यह जांचने के लिए कि क्या चर खाली है ... (शायद एक पंक्ति जोड़ें और लौटाए गए मान से 1 घटाएं?)।

+0

आप सभी खाली लाइनों को बाहर करना चाहते हैं या केवल तभी खाली जगह है? – Kent

+0

'गिट लॉग' या तो कुछ भी नहीं, या तो कुछ लाइनें उत्पन्न करता है। तो मुझे एक खाली var के मामले का इलाज करने की आवश्यकता है, क्योंकि परिवर्तनीय खाली नहीं होने पर रिक्त रेखाएं नहीं होंगी। – linkyndy

+0

यह सच नहीं है! 'गिट लॉग-एन 10 'खाली लाइनें उत्पन्न करता है। लेकिन मुझे वह चाहिए जो आप चाहते हैं। – Kent

उत्तर

12

wcन्यूलाइन वर्णों की संख्या की गणना करता है। आप लाइनों की गिनती के लिए grep -c '^' का उपयोग कर सकते हैं।

#!/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" 

क्या पैदा करता है: आप के साथ अंतर देख सकते हैं

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

इसके लिए 'grep -c'^'' का उपयोग करके महान सुझाव। – linkyndy

5

तुम हमेशा यह सशर्त लिख सकते हैं:

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

यह है कि क्या $VAR सामग्री की जांच और उसके अनुसार कार्य करेंगे।

+0

यह थोड़ा लंबा था, इसलिए सोचा कि कुछ बेहतर तरीका है। – linkyndy

+0

जैसे ही यह क्विर्की हो जाता है, मैं शायद सुरक्षित मार्ग लेता हूं और इसे स्पष्ट रूप से लिखता हूं। – nemo

1

कोशिश:

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

:) या सरल: 'grep -c'^'' - मेरा जवाब देखें ..;) – jm666

+0

ठीक है, बहुत अच्छा जवाब –

5

एक शुद्ध बैश समाधान के लिए: बजाय में git आदेश के उत्पादन में डालने की एक चर (जो, तर्कसंगत रूप से, बदसूरत है), इसे एक सरणी में रखें, प्रति पंक्ति एक पंक्ति:

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

तो फिर तुम केवल सरणी ary में क्षेत्रों की संख्या की गणना करने की जरूरत है:

echo "${#ary[@]}" 

इस डिजाइन भी अगर, उदाहरण के लिए, आप 5 वीं संदेश को पुन: प्राप्त करने के लिए प्रतिबद्ध की जरूरत है अपने जीवन को सरल कर देगा:

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

+1 यह सभी का सबसे अच्छा जवाब है। – anubhava

+1

एसओ पर मेरा पसंदीदा उपयोगकर्ता नाम +1 करें –

संबंधित मुद्दे