कैसे बाश में परिभाषित एक सरणी की लंबाई की गणना करने के लिए?


58

मैं बैश करने के लिए नया हूं और अपने प्रश्न का उत्तर देने के लिए एक अच्छा ट्यूटोरियल नहीं ढूंढ सकता।

array=( item1 item2 item3)
for name in ${array[@]}; do
    echo current/total
    ... some other codes
done

मैं "चालू" और "कुल" मान की गणना करना चाहता हूं, क्योंकि यह होने का अपेक्षित उत्पादन है:

1/3
2/3
3/3

किसी भी प्रकार की युक्तियों के लिए धन्यवाद


ध्यान दें कि आपको ${array[@]}दोहरे उद्धरण चिह्नों में रखना चाहिए । अन्यथा, शब्द-विभाजन का प्रदर्शन किया जाएगा और आपको इनपुट्स जैसे अवांछनीय परिणाम मिलेंगे array=("item 1" "item 2" "item 3")
गार्डेनहेड

जवाबों:


102

आप सरणी सूचकांकों का उपयोग कर सकते हैं ${!array[@]}और उपयोग करने वाले सरणी की लंबाई ${#array[@]}, उदाहरण के लिए:

#!/bin/bash

array=( item1 item2 item3 )
for index in ${!array[@]}; do
    echo $index/${#array[@]}
done

ध्यान दें कि चूंकि बैश सरणियां शून्य अनुक्रमित हैं , आप वास्तव में प्राप्त करेंगे:

0/3
1/3
2/3

आप गिनती 1 से चलाना चाहते हैं तो आप की जगह ले सकता $indexसे $((index+1))। यदि आप चाहते हैं मूल्यों के साथ-साथ सूचकांक आप उपयोग कर सकते हैं "${array[index]}"यानी

#!/bin/bash

array=( item1 item2 item3 )
for index in ${!array[@]}; do
    echo $((index+1))/${#array[@]} = "${array[index]}"
done

दे रही है

1/3 = item1
2/3 = item2
3/3 = item3

अगर मैं 1,2,3 प्राप्त करना चाहता हूं, तो क्या मैं यह कर सकता हूं echo ($index+1)/${#array[@]}:?
AGamePlayer

btw, ऐसा लगता है कि इस तरह से मैं आइटम 1, आइटम 2, आइटम 3 को लूप में नहीं पा सकता हूं। मेरे पास अभी भी आइटम 1, आइटम 2, आइटम 3 सामान से निपटने के लिए अन्य कोड हैं। धन्यवाद,
AGamePlayer 3

संपादित पोस्ट देखें।
स्टीलड्राइवर

1

यदि आप वास्तव में किसी सरणी के आधार पते से ऑफसेट होने के रूप में सूचकांक के बारे में सोचते हैं तो एक शून्य सूचकांक पूरी तरह से मान्य है । यह वास्तव में आदर्श है, हालांकि यह बोली से बोली में भिन्न होता है। पुरानी जोवियल भाषा के साथ, [0]वास्तव में सरणी का अधिकतम आकार शामिल था। इसलिए इसकी शुरुआत हुई [1]

कुछ बुनियादी कार्यान्वयन के साथ, आप मनमाने ढंग से 0या तो 1पहले सूचकांक के रूप में चुनाव कर सकते हैं । और कम से कम एक बेसिक आपको एरॉन [n]को इंडेक्स करने के लिए सरणियों को नामित करने की अनुमति देता है [m]। जहां nऔर mकिसी भी पूर्णांक मान हो सकता है, यहां तक ​​कि नकारात्मक, जब तक nकम से कम या इसके बराबर है m। मूल्य nउन्हें [index]दर्ज से घटाया जाता है , जैसे index-n = 0कि सूचकांक से मेल खाती है n

लेकिन आप अपने खुद के कोड में एक ही काम कर सकते हैं। आप किसी सरणी के क्रम को इस तरह भी उलट सकते हैं:

dim array(0, abs(m-n)); 
step=sign(m-n); 
if n > m then 
    base=m 
else 
    base=n; 
fi

यह कोड उदाहरण वास्तव में केवल एक भाषा का आंशिक हिस्सा है। मैं चाहता था कि यह अधिक पठनीय हो। स्टेप वेरिएबल का उपयोग उस स्पष्ट दिशा को नियंत्रित करने के लिए किया जाता है जिसे आप सकारात्मक या नकारात्मक में ले जा रहे हैं, और इसका उपयोग प्रभावी इंडेक्स की गणना करने के लिए किया जाता है, जब यह ऐरे में जा रहा है या बाहर निकल रहा है, जो वास्तव में हमेशा सकारात्मक है [0]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.