2009-12-10 16 views
56

मैं यूनिक्स शैल स्क्रिप्टिंग में सरणी कैसे बना सकता हूं?Arrays?

+0

पहला वाला एक अच्छा सवाल है, लेकिन प्रोग्राम निष्पादन चीज़ को इसके साथ क्या करना है? – Frank

+1

http://www.gnu.org/software/bash/manual/html_node/Arrays.html –

+0

देखें: [यूनिक्स बोर्न शैल में Arrays] (http://unix.stackexchange.com/questions/137566/arrays-in -निक्स-बोर्न-शैल # 137571) – agc

उत्तर

3

आप निम्न प्रकार की कोशिश कर सकते हैं:

#!/bin/bash 
declare -a arr 

i=0 
j=0 

    for dir in $(find /home/rmajeti/programs -type d) 
    do 
     arr[i]=$dir 
     i=$((i+1)) 
    done 


    while [ $j -lt $i ] 
    do 
     echo ${arr[$j]} 
     j=$((j+1)) 
    done 
+0

रिक्त स्थान के साथ निर्देशिका नामों पर टूटता है। आईएफएस को बदलने के लिए थोड़ी देर के पढ़ने के लूप का उपयोग करें। – ghostdog74

9
#!/bin/bash 

# define a array, space to separate every item 
foo=(foo1 foo2) 

# access 
echo ${foo[1]} 

# add or changes 
foo[0]=bar 
foo[2]=cat 
foo[1000]=also_OK 

आप एबीएस "उन्नत बैश-पटकथा गाइड"

44
बैश में

पढ़ सकते हैं, तो आप इस

arr=(one two three) 
तरह सारिणी निर्मित

तत्वों को कॉल करने के लिए

$ echo ${arr[0]} 
one 
$ echo ${arr[2]} 
three 

उपयोगकर्ता इनपुट के लिए पूछने के लिए है, तो आप उपयोग कर सकते हैं पढ़

read -p "Enter your choice: " choice 

है कि क्या आप के लिए पूछ रहे हैं।?

5

बोर्न शैल और सी खोल में सरणी नहीं हैं, आईआईआरसी।

इसके अलावा क्या अन्य लोगों ने कहा है, बैश में आप इस प्रकार एक सरणी में तत्वों की संख्या प्राप्त कर सकते हैं:

elements=${#arrayname[@]} 

और काट शैली संचालन करते हैं:

arrayname=(apple banana cherry) 
echo ${arrayname[@]:1}     # yields "banana cherry" 
echo ${arrayname[@]: -1}     # yields "cherry" 
echo ${arrayname[${#arrayname[@]}-1]} # yields "cherry" 
echo ${arrayname[@]:0:2}     # yields "apple banana" 
echo ${arrayname[@]:1:1}     # yields "banana" 
+0

सीएसएच में सरणी हैं। –

+0

@ किथ थॉम्पसन: यह [मैन पेज] (http://linux.die.net/man/1/csh) में प्रलेखित नहीं है लेकिन कार्यक्षमता कम से कम कुछ संस्करणों में मौजूद प्रतीत होती है। –

+2

मैन पेज उस नाम से "सरणी" का उल्लेख नहीं करता है, लेकिन 'set' कमांड' ('name name = (wordlist) ') के दस्तावेज़ और" परिवर्तनीय प्रतिस्थापन "अनुभाग (' $ name [selector] ' और '$ {नाम [चयनकर्ता]}')। जहां तक ​​मुझे पता है, सीएसएच ने हमेशा सरणी का समर्थन किया है। उदाहरण के लिए, '$ पथ' सरणी चर, देखें, जो' $ पाथ 'पर्यावरण परिवर्तक को प्रतिबिंबित करता है। –

0

ksh में आप यह कर:

set -A array element1 element2 elementn 

# view the first element 
echo ${array[0]} 

# Amount elements (You have to substitute 1) 
echo ${#array[*]} 

# show last element 
echo ${array[ $((${#array[*]} - 1)) ]} 
+0

अंतिम तत्व दिखाने के लिए एक और संक्षिप्त तरीका 'echo "$ {array [@]: (- 1)}" 'है। यह सरणी चर नाम को दो बार लिखने की आवश्यकता को समाप्त करता है। –

5

इस प्रयास करें:

+०१२३५१६४१०६
echo "Find the Largest Number and Smallest Number of a given number" 
echo "---------------------------------------------------------------------------------" 
echo "Enter the number" 
read n 

while [ $n -gt 0 ] #For Seperating digits and Stored into array "x" 
do 
     x[$i]=`expr $n % 10` 
     n=`expr $n/10` 
done 

echo "Array values ${x[@]}" # For displaying array elements 


len=${#x[*]} # it returns the array length 


for ((i=0; i<len; i++)) # For Sorting array elements using Bubble sort 
do 
    for ((j=i+1; j<len; j++)) 
    do 
     if [ `echo "${x[$i]} > ${x[$j]}"|bc` ] 
     then 
       t=${x[$i]} 
       t=${x[$i]} 
       x[$i]=${x[$j]} 
       x[$j]=$t 
     fi 
     done 
done 


echo "Array values ${x[*]}" # Displaying of Sorted Array 


for ((i=len-1; i>=0; i--)) # Form largest number 
do 
    a=`echo $a \* 10 + ${x[$i]}|bc` 
done 

echo "Largest Number is : $a" 

l=$a #Largest number 

s=0 
while [ $a -gt 0 ] # Reversing of number, We get Smallest number 
do 
     r=`expr $a % 10` 
     s=`echo "$s * 10 + $r"|bc` 
     a=`expr $a/10` 
done 
echo "Smallest Number is : $s" #Smallest Number 

echo "Difference between Largest number and Smallest number" 
echo "==========================================" 
Diff=`expr $l - $s` 
echo "Result is : $Diff" 


echo "If you try it, We can get it" 
12

बोर्न शैल सरणी का समर्थन नहीं करता है। हालांकि, इस मुद्दे को संभालने के दो तरीके हैं।

उपयोग स्थितीय खोल पैरामीटर $ 1, $ 2, आदि .:

$ set one two three 
$ echo $* 
one two three 
$ echo $# 
3 
$ echo $2 
two 

उपयोग चर मूल्यांकन:

$ n=1 ; eval a$n="one" 
$ n=2 ; eval a$n="two" 
$ n=3 ; eval a$n="three" 
$ n=2 
$ eval echo \$a$n 
two 
+1

बैश सरणी का समर्थन करता है। मूल बोर्न शेल के बारे में निश्चित नहीं है, लेकिन इन दिनों बैश अधिक प्रचलित है ... – plesiv

+2

@zplesivcak - ... जीएनयू/लिनक्स पर, क्योंकि यह एक जीएनयू चीज है। उदाहरण के लिए, * फ्रीबीएसडी * 'बैश 'के साथ नहीं भेजता है (हालांकि यह बंदरगाहों से स्थापित है)। 'बैश' सुविधाओं को मानने वाली लिपियों को पोर्टेबल नहीं माना जाता है, और वे बोर्न शेल कार्यान्वयन (जैसे 'डैश', जो * जीएनयू/लिनक्स वितरण पर * आम है) की तुलना में धीमे धीमे हैं। 'bash' एक अच्छा इंटरैक्टिव खोल है, लेकिन यह स्क्रिप्टिंग के लिए धीमा है। – tjameson

+1

'$ *' को हानिकारक माना जाता है। आम तौर पर, '$ @' को प्राथमिकता दी जाती है क्योंकि यह वही करता है, लेकिन रिक्त स्थान रखता है। '$ @' को "$ 1" "$ 2" "$ 3" ... "$ n" के रूप में विस्तारित किया गया है, जबकि '$ *' को "$ 1x $ 2x $ 3x ... $ n" के रूप में विस्तारित किया गया है, जहां 'x' '$ IFS' विभाजक है (सबसे अधिक संभावना है, अंतरिक्ष)। – zserge

1

keybord से मूल्यों को पढ़ सकते हैं और सरणी में तत्व सम्मिलित करने के लिए

# enter 0 when exit the insert element 
echo "Enter the numbers" 
read n 
while [ $n -ne 0 ] 
do 
    x[$i]=`expr $n` 
    read n 
    let i++ 
done 

#display the all array elements 
echo "Array values ${x[@]}" 
echo "Array values ${x[*]}" 

# To find the array length 
length=${#x[*]} 
echo $length 
56

निम्न कोड शैल में तारों की एक सरणी बनाता है और प्रिंट करता है:

#!/bin/bash 
array=("A" "B" "ElementC" "ElementE") 
for element in ${array[@]} 
do 
    echo $element 
done 

echo "" 
echo "Nbr of elements:" ${#array[@]} 

echo "" 
echo ${array[@]} 

परिणाम:

declare -A programCollection 
programCollection["xwininfo"]="to aquire information about the target window." 

for program in ${!programCollection[@]} 
do 
    echo "The program ${program} is used ${programCollection[${program}]}" 
done 

http://linux.die.net/man/1/bash "साहचर्य arrays -एक का नाम घोषित किए गए हैं:

A 
B 
ElementC 
ElementE 

Nbr of elements: 4 

A B ElementC ElementE 
+9

क्या आप वाकई '#!/Bin/sh' shebang के साथ काम करते हैं? मुझे लगता है कि इसका उपयोग करने के लिए आपको '#!/Bin/bash' का उपयोग करने की आवश्यकता है। – timurb

+0

धन्यवाद Erthad। दरअसल, मैंने इसे #!/Bin/bash में बदल दिया। –

3

आप रिक्त स्थान के लिए समर्थन के साथ एक महत्वपूर्ण मूल्य की दुकान चाहते हैं -A पैरामीटर का उपयोग करें। "

4

एक सरणी को दो बार लोड किया जा सकता है।

set -A TEST_ARRAY alpha beta gamma 

या

X=0 # Initialize counter to zero. 

- तार अल्फा, बीटा, गामा और

for ELEMENT in alpha gamma beta 
do 
    TEST_ARRAY[$X]=$ELEMENT 
    ((X = X + 1)) 
done 

इसके अलावा के साथ सरणी लोड करें, मुझे लगता है कि नीचे दी गई जानकारी में मदद कर सकते हैं:

खोल एक-आयामी सरणी का समर्थन करता है। सरणी तत्वों की अधिकतम संख्या 1,024 है। जब एक सरणी परिभाषित की जाती है, तो यह स्वचालित रूप से 1,024 तत्वों तक आयाम होता है। एक-आयामी सरणी में सरणी तत्वों का अनुक्रम होता है, जो एक ट्रेन ट्रैक पर से जुड़े बॉक्सकार्स की तरह हैं।

मामले में आप सरणी का उपयोग करना चाहते हैं:

echo ${MY_ARRAY[2] # Show the third array element 
gamma 


echo ${MY_ARRAY[*] # Show all array elements 
- alpha beta gamma 


echo ${MY_ARRAY[@] # Show all array elements 
- alpha beta gamma 


echo ${#MY_ARRAY[*]} # Show the total number of array elements 
- 3 


echo ${#MY_ARRAY[@]} # Show the total number of array elements 
- 3 

echo ${MY_ARRAY} # Show array element 0 (the first element) 
- alpha 
3

आपका प्रश्न के बारे में "यूनिक्स शेल पटकथा लेखन" पूछता है, लेकिन टैग है bash। वे दो अलग-अलग उत्तर हैं।

शैल के लिए POSIX विनिर्देश के पास सरणी के बारे में कुछ भी कहना नहीं है, क्योंकि मूल बोर्न शैल ने उनका समर्थन नहीं किया था। आज भी, फ्रीबीएसडी, उबंटू लिनक्स और कई अन्य प्रणालियों पर, /bin/sh में सरणी समर्थन नहीं है। इसलिए यदि आप अपनी स्क्रिप्ट को विभिन्न बोर्न-संगत शैल में काम करना चाहते हैं, तो आपको उनका उपयोग नहीं करना चाहिए। वैकल्पिक रूप से, यदि आप एक विशिष्ट खोल मान रहे हैं, तो सुनिश्चित करें कि उसका पूरा नाम शेबांग लाइन में रखें, उदा। #!/usr/bin/env bash

आप bash या zsh, या ksh का आधुनिक संस्करण का उपयोग कर रहे हैं, तो आप इस तरह एक सरणी बना सकते हैं:

myArray=(first "second element" 3rd) 

और उपयोग तत्वों को इस

$ echo "${myArray[1]}" 
second element 

आप सभी प्राप्त कर सकते हैं की तरह "${myArray[@]}" के माध्यम से तत्व। आप संदर्भित सरणी के हिस्से को प्रतिबंधित करने के लिए स्लाइस नोटेशन $ {array [@]: प्रारंभ करें: लंबाई} का उपयोग कर सकते हैं। पहले तत्व को छोड़ने के लिए "${myArray[@]:1}"

सरणी की लंबाई ${#myArray[@]} है। आप "${!myArray[@]}" के साथ मौजूदा सरणी से सभी इंडेक्स युक्त एक नई सरणी प्राप्त कर सकते हैं।

ksh93 से पहले ksh के पुराने संस्करणों में भी सरणी थी, लेकिन ब्रांड्स-आधारित नोटेशन नहीं, और न ही उन्होंने स्लाइसिंग का समर्थन किया। आप इस तरह एक सरणी बना सकते हैं, हालांकि:

set -A myArray -- first "second element" 3rd 
संबंधित मुद्दे