arrays - बैश में तारों की एक सरणी के माध्यम से लूप?




bash shell (11)

मैं एक स्क्रिप्ट लिखना चाहता हूं जो 15 तारों (सरणी संभवतः?) के माध्यम से लूप करता है क्या यह संभव है?

कुछ इस तरह:

for databaseName in listOfNames
then
  # Do something
end

स्क्रिप्ट या कार्यों के लिए लागू सरणी:

anubhava के सही उत्तर के अलावा: यदि लूप के लिए मूल वाक्यविन्यास है:

for var in "${arr[@]}" ;do ...$var... ;done

bash में एक विशेष मामला है:

स्क्रिप्ट या फ़ंक्शन चलाते समय, कमांड लाइनों पर पारित तर्क [email protected] array variable को असाइन किए जाएंगे, आप $1 , $2 , $3 , और इसी तरह से एक्सेस कर सकते हैं।

यह आबादी (परीक्षण के लिए) द्वारा किया जा सकता है

set -- arg1 arg2 arg3 ...

इस सरणी पर एक लूप बस लिखा जा सकता है:

for item ;do
    echo "This is item: $item."
  done

ध्यान दें कि आरक्षित कार्य मौजूद नहीं है और कोई सरणी नाम भी नहीं है!

नमूना:

set -- arg1 arg2 arg3 ...
for item ;do
    echo "This is item: $item."
  done
This is item: arg1.
This is item: arg2.
This is item: arg3.
This is item: ....

ध्यान दें कि यह एक जैसा है

for item in "[email protected]";do
    echo "This is item: $item."
  done

फिर एक लिपि में :

#!/bin/bash

for item ;do
    printf "Doing something with '%s'.\n" "$item"
  done

इसे एक स्क्रिप्ट myscript.sh , chmod +x myscript.sh में सहेजें, फिर

./myscript.sh arg1 arg2 arg3 ...
Doing something with 'arg1'.
Doing something with 'arg2'.
Doing something with 'arg3'.
Doing something with '...'.

एक समारोह में वही:

myfunc() { for item;do cat <<<"Working about '$item'."; done ; }

फिर

myfunc item1 tiem2 time3
Working about 'item1'.
Working about 'tiem2'.
Working about 'time3'.

4ndrew के जवाब के रूप में एक ही भावना में:

listOfNames="RA
RB
R C
RD"

# To allow for other whitespace in the string:
# 1. add double quotes around the list variable, or
# 2. see the IFS note (under 'Side Notes')

for databaseName in "$listOfNames"   #  <-- Note: Added "" quotes.
do
  echo "$databaseName"  # (i.e. do action / processing of $databaseName here...)
done

# Outputs
# RA
# RB
# R C
# RD

बी नामों में कोई सफेद जगह नहीं:

listOfNames="RA
RB
R C
RD"

for databaseName in $listOfNames  # Note: No quotes
do
  echo "$databaseName"  # (i.e. do action / processing of $databaseName here...)
done

# Outputs
# RA
# RB
# R
# C
# RD

टिप्पणियाँ

  1. दूसरे उदाहरण में, listOfNames="RA RB RC RD" का उपयोग एक ही आउटपुट है।

डेटा लाने के अन्य तरीकों में शामिल हैं:

  • stdin (नीचे सूचीबद्ध)
  • variables ,
  • एक सरणी (स्वीकृत उत्तर),
  • एक फाइल ...

Stdin से पढ़ें

# line delimited (each databaseName is stored on a line)
while read databaseName
do
  echo "$databaseName"  # i.e. do action / processing of $databaseName here...
done # <<< or_another_input_method_here
  1. बैश IFS "फ़ील्ड सेपरेटर लाइन" [ 1 ] डिलीमीटर को स्क्रिप्ट में अन्य व्हाइटस्पेस (यानी IFS='\n' , या मैकोज़ IFS='\r' लिए अनुमति देने के लिए निर्दिष्ट किया जा सकता है)
  2. मुझे स्वीकार्य उत्तर भी पसंद है :) - मैंने इन स्निपेट को अन्य सहायक तरीकों के रूप में शामिल किया है जो प्रश्न का उत्तर भी देते हैं।
  3. स्क्रिप्ट फ़ाइल के शीर्ष पर #!/bin/bash सहित निष्पादन वातावरण इंगित करता है।
  4. मुझे यह समझने के लिए महीनों लगे कि इसे कैसे कोड करें :)

अन्य स्रोत ( जबकि लूप पढ़ते हैं )


आप इसे इस तरह इस्तेमाल कर सकते हैं:

## declare an array variable
declare -a arr=("element1" "element2" "element3")

## now loop through the above array
for i in "${arr[@]}"
do
   echo "$i"
   # or do whatever with individual element of the array
done

# You can access them using echo "${arr[0]}", "${arr[1]}" also

मल्टी-लाइन सरणी घोषणा के लिए भी काम करता है

declare -a arr=("element1" 
                "element2" "element3"
                "element4"
                )

इनमें से कोई भी जवाब काउंटर शामिल नहीं है ...

#!/bin/bash
## declare an array variable
declare -a array=("one" "two" "three")

# get length of an array
arraylength=${#array[@]}

# use for loop to read all values and indexes
for (( i=1; i<${arraylength}+1; i++ ));
do
  echo $i " / " ${arraylength} " : " ${array[$i-1]}
done

आउटपुट:

1  /  3  :  one
2  /  3  :  two
3  /  3  :  three

घोषित सरणी कॉर्न खोल के लिए काम नहीं करती है। कॉर्न खोल के लिए नीचे दिए गए उदाहरण का प्रयोग करें:

promote_sla_chk_lst="cdi xlob"

set -A promote_arry $promote_sla_chk_lst

for i in ${promote_arry[*]};
    do
            echo $i
    done

प्रत्येक बैश स्क्रिप्ट / सत्र की संभावित पहली पंक्ति:

say() { for line in "${@}" ; do printf "%s\n" "${line}" ; done ; }

उदाहरण का प्रयोग करें:

$ aa=( 7 -4 -e ) ; say "${aa[@]}"
7
-4
-e

विचार कर सकते हैं: echo व्याख्याएं - यहां विकल्प के रूप में


यदि आप कॉर्न शैल का उपयोग कर रहे हैं, तो " set -A डेटाबेस नाम " है, अन्यथा " declare -a डेटाबेस नाम " है

सभी गोले पर काम कर रहे एक स्क्रिप्ट लिखने के लिए,

 set -A databaseName=("db1" "db2" ....) ||
        declare -a databaseName=("db1" "db2" ....)
# now loop 
for dbname in "${arr[@]}"
do
   echo "$dbname"  # or whatever

done

यह सभी गोले पर काम होना चाहिए।


यह user2533809 के उत्तर के समान है, लेकिन प्रत्येक फ़ाइल को एक अलग कमांड के रूप में निष्पादित किया जाएगा।

#!/bin/bash
names="RA
RB
R C
RD"

while read -r line; do
    echo line: "$line"
done <<< "$names"

यह पढ़ना भी आसान है:

FilePath=(
    "/tmp/path1/"    #FilePath[0]
    "/tmp/path2/"    #FilePath[1]
)

#Loop
for Path in "${FilePath[@]}"
do
    echo "$Path"
done

सिंगल लाइन लूपिंग,

 declare -a listOfNames=('db_a' 'db_b' 'db_c')
 for databaseName in ${listOfNames[@]}; do echo $databaseName; done;

आपको इस तरह का आउटपुट मिलेगा,

db_a
db_b
db_c

listOfNames="db_one db_two db_three"
for databaseName in $listOfNames
do
  echo $databaseName
done

या केवल

for databaseName in db_one db_two db_three
do
  echo $databaseName
done






unix