क्या बैश साहचर्य सरणी चर पर सभी 'अनुक्रमित आईडी' (कुंजी) को सूचीबद्ध करने का एक तरीका है?


26

मेरे पास यह सरणी है:

declare -A astr

मैं इसमें तत्व जोड़ता हूं:

astr[elemA]=123
astr[elemB]=199

लेकिन बाद में मुझे यह जानने की जरूरत है कि इंडेक्स आईडी (एलईएमएक्सए और एलएमबी) क्या हैं और उन्हें सूचीबद्ध करें।

echo "${astr[@]}" #this only get me the values...

जवाबों:


35

आप इस तरह के साहचर्य सरणी के लिए "कुंजी" की सूची प्राप्त कर सकते हैं:

$ echo "${!astr[@]}"
elemB elemA

आप "कुंजी" पर ऐसा कर सकते हैं:

for i in "${!astr[@]}"
do   
  echo "key  : $i"
  echo "value: ${astr[$i]}"
done

उदाहरण

$ for i in "${!astr[@]}"; do echo "key  : $i"; echo "value: ${astr[$i]}"; done
key  : elemB
value: 199
key  : elemA
value: 123

संदर्भ


1
मैंने पाया कि यह संख्यात्मक रूप से अनुक्रमित सरणियों के लिए भी काम करता है: astr2=(a b c d e);echo ${!astr2[@]};unset astr2[2];echo ${!astr2[@]}thx!
कुंभ राशि

@AquariusPower - हाँ, यदि आप मेरे उत्तर पर संपादन वापस करते हैं, तो आप देखेंगे कि मैंने मूल रूप से संख्यात्मक सूचकांक को भी शामिल किया था, लेकिन तब से इसे छोड़ दिया जब से आप हैश नाम चाहते थे।
स्लम

ध्यान दें कि ${!var[index]}केवल काम नहीं करता है, ${!var[@]}या ${!var[*]}:(
i336_

@ i336_ - !इसे बाहर निकालें ${var[index]}tldp.org/LDP/abs/html/arrays.html
SLM

क्षमा करें, स्पष्टीकरण: मैं संख्यात्मक सूचकांक n के लिए साहचर्य कुंजी निर्धारित करने की कोशिश कर रहा था । मुझे एहसास हुआ कि मैं आसानी से कर सकता हूं keys=(${!var[@]})और फिर ${keys[n]}, मुझे सूचकांक दे रहा है, लेकिन उसी समय के आसपास मुझे भी एहसास हुआ कि मुझे अपने दृष्टिकोण पर पुनर्विचार करने की आवश्यकता है।
३३६_
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.