Bash හි ඇති නූල් සමූහයක් හරහා ලූපයක්?


1536

මට නූල් 15 ක් හරහා ලිවිය හැකි පිටපතක් ලිවීමට අවශ්‍යයි (අරාව සමහර විට?) එය කළ හැකිද?

වැනි දෙයක්:

for databaseName in listOfNames
then
  # Do something
end

Answers:


2444

ඔබට එය මේ ආකාරයෙන් භාවිතා කළ හැකිය:

## 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"
                )

6
අවට ඇති ද්විත්ව උපුටා දැක්වීම් "${arr[@]}"සැබවින්ම වැදගත් බව සලකන්න . ඒවා නොමැතිව, අර්‍ගය තුළ ඇති සම්පූර්ණ නූල් මූලද්‍රව්‍ය වෙනුවට නූල් තුළ ඇති ඕනෑම අවකාශයකින් වෙන් කරන උපස්ථර මගින් for for loop අරාව බිඳ දමනු ඇත. එනම්: ඔබ සිටියා නම් declare -a arr=("element 1" "element 2" "element 3"), එසේ නම් for i in ${arr[@]}එක් එක් සංගීත 2 substrings අවකාශය විසින් වැල දී, එනමුදු වෙන් බවට පත් සිට වැරදීමකින් අවංකව 6 ගුණයක් බව for i in "${arr[@]}"කැමති පරිදි, නිවැරදිව, 3 වරක් වඩාත් කැපීපෙනේ ඇත, තනි ඒකකයක් ලෙස එක් එක් සංගීත පවත්වා එය අභ්යවකාශ තිබියදීත් .
ගේබ්‍රියෙල් ස්ටැපල්ස්

791

ඇත්ත වශයෙන්ම එය කළ හැකි ය.

for databaseName in a b c d e f; do
  # do something like: echo $databaseName
done 

විස්තර සඳහා, අතරතුර සහ තෙක් Bash Loops බලන්න .


18
මෙම ප්රවේශයේ ඇති ගැටළුව කුමක්ද? සරල අවස්ථා වලදී එය ක්‍රියාත්මක වන බවක් පෙනේ. එසේනම් අනුභවාගේ පිළිතුරට වඩා බුද්ධිමත් ය.
ආචාර්ය ජෑන්-පිලිප් ගෙර්ක්

17
විධාන ආදේශනය සමඟ මෙය විශේෂයෙන් හොඳින් ක්‍රියාත්මක වේ, උදා for year in $(seq 2000 2013).
බ්‍රැඩ් කොච්

23
ගැටළුව වන්නේ ඔහු අරාව හරහා නැවත යෙදීම ගැන විමසීමයි.
mgalgs

20
ඔබට එක තැනකට වඩා වැඩි ගණනක එකම අරාව හරහා නැවත යෙදීමට සිදුවුවහොත් 'ප්‍රකාශ කරන්න' ප්‍රවේශය වඩාත් සුදුසු වේ. මෙම ප්‍රවේශය වඩා පිරිසිදු නමුත් නම්‍යශීලී නොවේ.
ස්ටැම්පිකෝඩ්

16
මෙය # 1 නොවන්නේ ඇයි? එය වඩා පිරිසිදුයි, ඔබට නූලක් සැකසීමෙන් පහසුවෙන් අරාව නැවත භාවිතා කළ හැකිය, එනම් DATABASES="a b c d e f".
නර්ඩ්මාස්ටර්

208

එම පිළිතුරුවලට කවුන්ටරයක් ​​ඇතුළත් නොවේ ...

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

7
මෙය පිළිගත් පිළිතුර විය යුතුය, අරාව මූලද්‍රව්‍යවල අවකාශයන් ඇති විට ක්‍රියාත්මක වන එකම එක මෙයයි.
ජෙස්ජිමර්

1
එය කවුන්ටරයක් ​​සමඟ උදාහරණයේ ප්‍රතිදානය සඳහා පමණි. එය වෙනස් කිරීම ද ඉතා සුළු කාරණයක් වන අතර එය එසේම වේ.
caktux

7
අවසානයේ ඇති දෝංකාරය දෝෂ සහිතය. ඔබට නියතයන් උපුටා දැක්වීමට අවශ්‍ය නැත, ඔබට පුළුල් කිරීම් උපුටා දැක්විය යුතුය, නැතහොත් ආරක්ෂිතව පහත සඳහන් දෙකම උපුටා දැක්විය හැකිය: echo "$i / ${arraylength} : ${array[$i-1]}"- එසේ නොමැතිනම්, ඔබේ $iග්ලෝබ් එකක් තිබේ නම් එය පුළුල් වනු ඇත, එය ටැබ් එකක් තිබේ නම් එය වෙනස් වනු ඇත අවකාශයක් යනාදිය
චාල්ස් ඩෆි

10
zebzeaman, විශ්වාසයි - නමුත් ඔබ එවැනි දේ ගැන අලස නම්, යම් දෙයක් නිවැරදි බව ඔප්පු කිරීමට සන්දර්භ විශ්ලේෂණය (ඔබ කළ පරිදි) අවශ්‍ය වන අතර, එම සන්දර්භය වෙනස් වුවහොත් හෝ කේතය වෙනත් ස්ථානයක හෝ නැවත භාවිතා කරන්නේ නම් නැවත විශ්ලේෂණය කිරීම අවශ්‍ය වේ. වෙනත් හේතුවක් නිසා අනපේක්ෂිත පාලන ප්‍රවාහයක් සිදුවිය හැකිය. සන්දර්භය නොසලකා එය නිවැරදි ආකාරයකින් ලියන්න.
චාල්ස් ඩෆි

6
මෙය විරල අරාව සඳහා ක්‍රියා නොකරනු ඇත, එනම් අරාවෙහි මූලද්‍රව්‍ය නොමැති නම්. උදාහරණයක් ලෙස, ඔබට A [1] = 'xx', A [4] = 'yy' සහ A [9] = 'zz' යන අරා මූලද්‍රව්‍ය තිබේ නම්, දිග 3 ක් වන අතර ලූපය සියලු මූලද්‍රව්‍යයන් ක්‍රියා නොකරනු ඇත .
එඩ්

162

ඔව්

for Item in Item1 Item2 Item3 Item4 ;
  do
    echo $Item
  done

ප්‍රතිදානය:

Item1
Item2
Item3
Item4

අවකාශය ආරක්ෂා කිරීමට; තනි හෝ ද්විත්ව මිල ගණන් ලැයිස්තු ඇතුළත් කිරීම් සහ ද්විත්ව මිල ලැයිස්තු පුළුල් කිරීම්.

for Item in 'Item 1' 'Item 2' 'Item 3' 'Item 4' ;
  do
    echo "$Item"
  done

ප්‍රතිදානය:

Item 1
Item 2
Item 3
Item 4

බහුවිධ රේඛා ඔස්සේ ලැයිස්තුවක් සෑදීමට

for Item in Item1 \
            Item2 \
            Item3 \
            Item4
  do
    echo $Item
  done

ප්‍රතිදානය:

Item1
Item2
Item3
Item4


සරල ලැයිස්තු විචල්‍යය

List=( Item1 Item2 Item3 )

හෝ

List=(
      Item1 
      Item2 
      Item3
     )

ලැයිස්තු විචල්‍යය පෙන්වන්න:

echo ${List[*]}

ප්‍රතිදානය:

Item1 Item2 Item3

ලැයිස්තුව හරහා බලන්න:

for Item in ${List[*]} 
  do
    echo $Item 
  done

ප්‍රතිදානය:

Item1
Item2
Item3

ලැයිස්තුවක් හරහා යාමට ශ්‍රිතයක් සාදන්න:

Loop(){
  for item in ${*} ; 
    do 
      echo ${item} 
    done
}
Loop ${List[*]}

ලැයිස්තුව නිර්මාණය කිරීම සඳහා ප්‍රකාශන යතුර (විධානය) භාවිතා කිරීම තාක්ෂණික වශයෙන් අරාව ලෙස හැඳින්වේ:

declare -a List=(
                 "element 1" 
                 "element 2" 
                 "element 3"
                )
for entry in "${List[@]}"
   do
     echo "$entry"
   done

ප්‍රතිදානය:

element 1
element 2
element 3

සහායක අරාවක් නිර්මාණය කිරීම. ශබ්දකෝෂයක්:

declare -A continent

continent[Vietnam]=Asia
continent[France]=Europe
continent[Argentina]=America

for item in "${!continent[@]}"; 
  do
    printf "$item is in ${continent[$item]} \n"
  done

ප්‍රතිදානය:

 Argentina is in America
 Vietnam is in Asia
 France is in Europe

CVS විචල්යයන් හෝ ලිපිගොනු ලැයිස්තුවකට .
අභ්‍යන්තර ක්ෂේත්‍ර බෙදුම්කරු අවකාශයකින්, ඔබට අවශ්‍ය දේට වෙනස් කිරීම.
පහත උදාහරණයේ එය කොමාවකට වෙනස් වේ

List="Item 1,Item 2,Item 3"
Backup_of_internal_field_separator=$IFS
IFS=,
for item in $List; 
  do
    echo $item
  done
IFS=$Backup_of_internal_field_separator

ප්‍රතිදානය:

Item 1
Item 2
Item 3

ඒවා අංක කිරීමට අවශ්‍ය නම්:

` 

මෙය පසුපස ටික් ලෙස හැඳින්වේ. පිටුපස කිනිතුල්ලන් තුළ විධානය තබන්න.

`commend` 

එය ඔබගේ යතුරුපුවරුවේ අංක එක අසල හෝ ටැබ් යතුරට ඉහළින් පිහිටා ඇත. සම්මත ඇමරිකානු ඉංග්‍රීසි භාෂා යතුරු පුවරුවක.

List=()
Start_count=0
Step_count=0.1
Stop_count=1
for Item in `seq $Start_count $Step_count $Stop_count`
    do 
       List+=(Item_$Item)
    done
for Item in ${List[*]}
    do 
        echo $Item
    done

ප්‍රතිදානය:

Item_0.0
Item_0.1
Item_0.2
Item_0.3
Item_0.4
Item_0.5
Item_0.6
Item_0.7
Item_0.8
Item_0.9
Item_1.0

බාෂ් හැසිරීම ගැන වඩාත් හුරු වීම:

ගොනුවක ලැයිස්තුවක් සාදන්න

cat <<EOF> List_entries.txt
Item1
Item 2 
'Item 3'
"Item 4"
Item 7 : *
"Item 6 : * "
"Item 6 : *"
Item 8 : $PWD
'Item 8 : $PWD'
"Item 9 : $PWD"
EOF

ලැයිස්තු ගොනුව ලැයිස්තුවකට කියවා දර්ශනය කරන්න

List=$(cat List_entries.txt)
echo $List
echo '$List'
echo "$List"
echo ${List[*]}
echo '${List[*]}'
echo "${List[*]}"
echo ${List[@]}
echo '${List[@]}'
echo "${List[@]}"

BASH විධාන රේඛා යොමු අත්පොත: කවචයට ඇතැම් අක්ෂර හෝ වචනවල විශේෂ අරුත.


7
මේක වැරදියි. විය යුතු "${List[@]}", නිවැරදි බව මේ ආකාරයටම සමග . ${List[@]}වැරදියි. ${List[*]}වැරදියි. උත්සාහ කරන්න List=( "* first item *" "* second item *" )- ඔබට නිවැරදි හැසිරීමක් ලැබෙනු ඇත for item in "${List[@]}"; do echo "$item"; done, නමුත් වෙනත් ප්‍රභේදයකින් නොවේ.
චාල්ස් ඩෆි

1
ඔව්, විශේෂ අක්ෂර අර්ථ නිරූපණය කරනු ලැබේ, එය සුදුසු හෝ නොවිය හැකිය. ඇතුළත් කිරීමට මම පිළිතුර යාවත්කාලීන කළෙමි.
abc

2
පළමුවෙන්ම වඩාත් නිවැරදි / ශක්තිමත් ප්‍රවේශය පෙන්වීමට මම තවමත් තරයේ යෝජනා කරමි . බොහෝ විට ජනතාව එය ක්‍රියාත්මක වන බව පෙනෙන පළමු පිළිතුර ගනී; එම පිළිතුරේ සැඟවුණු අවවාද තිබේ නම්, ඔවුන් පසුව හෙළිදරව් කළ හැක්කේ පසුව පමණි. (; එය උපුටා දක්වමින් නොවීම සිත් ඇති යන්තම් ආදේශක නොවේ List=( "first item" "second item" )කඩා ඇත first, item, second, itemමෙන්ම).
චාල්ස් ඩෆි

හොඳම භාවිතයන්ට පටහැනිවls , ප්‍රතිදානය විග්‍රහ කිරීමට මිනිසුන් යොමු කළ හැකි නිදසුනක් භාවිතා කිරීමෙන් වැළකී සිටීම ගැනද ඔබ සලකා බැලිය හැකිය .
චාල්ස් ඩෆි

1
මම කවදාවත් නොකළ ප්‍රකාශ ඔබ ප්‍රතික්ෂේප කරනවා. මම බාෂ්ගේ
චාල්ස් ඩෆි

108

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

B. නම් වල හිස් අවකාශයක් නොමැත:

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 R C RD"කිරීම එකම ප්‍රතිදානයක් ඇත.

දත්ත ගෙන ඒමට ඇති වෙනත් ක්‍රම අතරට:

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. මෙම bash IFS "ක්ෂේත්රය වෙන්කර රේඛාව" [ 1 ] පරිසීමකය (එනම් වෙනත් whitespace ඉඩ කේත රචනය තුල නියම කල හැක IFS='\n', හෝ MacOS සඳහා IFS='\r')
  2. මම පිළිගත් පිළිතුරටද කැමතියි :) - ප්‍රශ්නයට පිළිතුරු සපයන වෙනත් ප්‍රයෝජනවත් ක්‍රම ලෙස මම මෙම කොටස් ඇතුළත් කර ඇත්තෙමි.
  3. #!/bin/bashස්ක්‍රිප්ට් ගොනුවේ ඉහළින්ම ඇතුළත් කිරීමෙන් ක්‍රියාත්මක වන පරිසරය දැක්වේ.
  4. මෙය සරලව කේත කරන්නේ කෙසේදැයි සොයා ගැනීමට මට මාස ගණනාවක් ගත විය :)

වෙනත් ප්‍රභවයන් ( ලූප කියවන අතරතුර )


මෙමඟින් ඉයෝල් නූල් බෙදුම්කරුවන් ලෙස භාවිතා වන බවට හැඟීමක් ඇති කරයි. කෙසේ වෙතත්, සුදු අවකාශයන් සහිත නූල් තවදුරටත් උපස්ථර වලට වෙන් කරනු ලැබේ, එය ඉතා නරක ය. මෙම පිළිතුර stackoverflow.com/a/23561892/1083704 වඩා හොඳ යැයි මම සිතමි .
Val

1
AlVal, මම යොමු කිරීමක් සමඟ කේත විවරණයක් එක් කළෙමි IFS. (සෑම කෙනෙකුටම, IFSනිශ්චිත පරිසීමකය නියම කිරීමට කෙනෙකුට ඉඩ දෙයි, එමඟින් අනෙක් සුදු අවකාශය උපස්ථර වලට වෙන් නොකර නූල්වලට ඇතුළත් කිරීමට ඉඩ දෙයි).
dajon

7
මෙය මට වැඩ කරන්නේ නැත. $databaseNameසම්පූර්ණ ලැයිස්තුවම අඩංගු වන අතර, එමඟින් සිදු කරන්නේ එක් පුනරාවර්තනයක් පමණි.
AlikElzin-kilaka

@ AlikElzin-kilaka පහත දැක්වෙන මගේ පිළිතුර මෙම ගැටළුව විසඳන අතර එමඟින් නූලෙහි සෑම පේළියක් සඳහාම ලූපය ක්‍රියාත්මක වේ.
ජේමි

43

ඔබට සින්ටැක්ස් භාවිතා කළ හැකිය ${arrayName[@]}

#!/bin/bash
# declare an array called files, that contains 3 values
files=( "/etc/passwd" "/etc/group" "/etc/hosts" )
for i in "${files[@]}"
do
    echo "$i"
done

32

කිසිවෙකු මෙය තවම පළ නොකිරීම ගැන පුදුමයට පත් වේ - ඔබ අරාව හරහා ලූප වන විට ඔබට මූලද්‍රව්‍යවල දර්ශක අවශ්‍ය නම්, ඔබට මෙය කළ හැකිය:

arr=(foo bar baz)

for i in ${!arr[@]}
do
    echo $i "${arr[i]}"
done

ප්‍රතිදානය:

0 foo
1 bar
2 baz

"සාම්ප්‍රදායික" සඳහා ලූප් විලාසිතාවට ( for (( i=0; i<${#arr[@]}; i++ ))) වඩා මෙය අලංකාර බව මට පෙනේ .

( ${!arr[@]}හා $iඔවුන් කරන්නේ හුදෙක් සංඛ්යා නිසා උපුටා ගත කිරීමට අවශ්ය නැත, ඇතැම් කෙසේ හෝ ඔවුන් උපුටා දක්වමින් යෝජනා කරන්නේ, නමුත්, එම සාධාරණ පෞද්ගලික කැමැත්ත තියෙන්නේ.)


2
මෙය සැබවින්ම තෝරාගත් පිළිතුර විය යුතුය. 1: එය සරල හා කියවීමට පහසුය. 2: එය හිස් අවකාශය නිවැරදිව හසුරුවයි, කිසිදු IFS විකාරයක් මඟ හැරෙන්නේ නැත. 3: එය විරල අරා නිවැරදිව හසුරුවයි.
mrm

20

මෙය කියවීමටද පහසුය:

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

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

4
මෙය පැහැදිලි වන අතර මා වෙනුවෙන් වැඩ කර ඇත (ෆයිල්පාත් අරා මූලද්‍රව්‍යවල අවකාශයන් සහ විචල්‍ය ආදේශකද ඇතුළුව) මම ෆයිල්පාත් අරාව අර්ථ දැක්වීමට පෙර අයිඑෆ්එස් විචල්‍යය නිවැරදිව සැකසූ විට පමණි : IFS=$'\n' මෙය මෙම තත්වය තුළ වෙනත් විසඳුම් සඳහාද ක්‍රියා කරයි.
ඇලන් ෆෝසයිත්

9

ස්ක්‍රිප්ට් හෝ කාර්යයන් සඳහා ව්‍යංග අරාව:

අමතරව anubhava ගේ නිවැරදි පිළිතුර: පුඩුවක් සඳහා මූලික syntax භාවිතා වේ නම්:

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

යම් කෙනෙක් විශේෂ නඩුව:

තිර රචනය හෝ උත්සවයකට ක්රියාත්මක වන විට, තර්ක විධාන රේඛා සම්මත සඳහා අනුයුක්ත කරනු ඇත $@අරා විචල්ය, ඔබ විසින් ප්රවේශ විය හැකි $1, $2, $3, සහ යනාදි.

මෙය ජනගහනය කළ හැකිය (පරීක්ෂණය සඳහා)

set -- arg1 arg2 arg3 ...

පුඩුවක් පුරා මෙම අරාව හුදෙක් ලිඛිත කළ හැකි:

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

වෙන් කර ඇති කාර්යය inනොපවතින බවත් අරාවෙහි නමක් නොමැති බවත් සලකන්න !

නියැදිය:

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 "$@";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'.

7
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

7

සරල ක්‍රමය:

arr=("sharlock"  "bomkesh"  "feluda" )  ##declare array

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

#iterate with while loop
i=0
while [ $i -lt $len ]
do
    echo ${arr[$i]}
    i=$((i+1))
done


#iterate with for loop
for i in $arr
do
  echo $i
done

#iterate with splice
 echo ${arr[@]:0:3}

6

කෝර්න් ෂෙල් සඳහා ප්‍රකාශන අරාව ක්‍රියා නොකරයි. කෝර්න් කවචය සඳහා පහත උදාහරණය භාවිතා කරන්න:

promote_sla_chk_lst="cdi xlob"

set -A promote_arry $promote_sla_chk_lst

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

2
ඔබේ කේතය හොඳ පෙනුමක් ලබා දීමට සංස්කාරකයේ කේත හයිලයිටරය උත්සාහ කරන්න.
පරෙවියා

5
දැන ගැනීම සතුටක්, නමුත් මෙම ප්‍රශ්නය බාෂ් ගැන ය.
බ්‍රැඩ් කොච්

1
ලොට්සා දෝෂ මෙහි ඇත. අවකාශයන් සමඟ ලැයිස්තු ඇතුළත් කිරීම් තිබිය නොහැක, ගෝලීය අක්ෂර සහිත ලැයිස්තු ඇතුළත් කිරීම් තිබිය නොහැක. for i in ${foo[*]}මූලික වශයෙන් සෑම විටම වැරදි දෙය - for i in "${foo[@]}"මුල් ලැයිස්තුවේ සීමාවන් ආරක්ෂා කරන සහ ගෝලීය ව්‍යාප්තිය වළක්වන ආකෘතියයි. දෝංකාරය විය යුතුයිecho "$i"
චාල්ස් ඩෆි

4

මෙය පරිශීලක 2533809 ගේ පිළිතුරට සමාන ය, නමුත් සෑම ගොනුවක්ම වෙනම විධානයක් ලෙස ක්‍රියාත්මක වේ.

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

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

3

ඔබ කෝර්න් ෂෙල් භාවිතා කරන්නේ නම්, " set -A databaseName " ඇත, එසේ නොමැතිනම් " ප්‍රකාශ කරන්න -a databaseName "

සියලුම කවච මත වැඩ කරන පිටපතක් ලිවීමට,

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

done

එය සියලුම ෂෙල් වෙඩි මත වැඩ කළ යුතුය.


3
නැත, එය එසේ නොවේ: $ bash --versionGNU bash, 4.3.33 (0) අනුවාදය - මුදා හැරීම (amd64-portbld-freebsd10.0) $ set -A databaseName=("db1" "db2" ....) || declare -a databaseName=("db1" "db2" ....)bash: අනපේක්ෂිත ටෝකනය අසල වාක්‍ය ඛණ්ඩය `('
බර්නි රයිටර්

2

මේක උත්සාහ කරන්න. එය ක්‍රියාත්මක වන අතර පරීක්ෂා කරනු ලැබේ.

for k in "${array[@]}"
do
    echo $k
done

# For accessing with the echo command: echo ${array[0]}, ${array[1]}

3
මෙය ඇත්ත වශයෙන්ම නිවැරදිව ක්‍රියා නොකරයි. උත්සාහ කරන්න array=( "hello world" ), හෝ arrray=( "*" ); පළමු අවස්ථාවේ දී එය මුද්‍රණය helloකර worldවෙන වෙනම, දෙවනුව එය වෙනුවට ගොනු ලැයිස්තුවක් මුද්‍රණය කරනු ඇත*
චාල්ස් ඩෆි

6
... ෂෙල් එකෙන් "පරීක්ෂා කරන ලද" යමක් ඇමතීමට පෙර, සුදු පැහැති අවකාශය සහ ග්ලෝබ් යන දෙකම අතර ඇති කෙළවරේ ඇති අවස්ථා පරීක්ෂා කිරීමට වග බලා ගන්න.
චාල්ස් ඩෆි

2

සෑම බෑෂ් ස්ක්‍රිප්ටයක / සැසියකම හැකි පළමු පේළිය:

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

උදා: භාවිතා කරන්න:

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

සලකා බැලිය හැකිය: මෙහි විකල්පය ලෙස echoඅර්ථ නිරූපණය -eකරයි


2

තනි පේළි ලූප,

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

ඔබට මේ වගේ ප්‍රතිදානයක් ලැබෙනු ඇත,

db_a
db_b
db_c

2

මේ සඳහා මට ඇත්තටම අවශ්‍ය වූයේ මේ වගේ දෙයක්:

for i in $(the_array); do something; done

උදාහරණයක් වශයෙන්:

for i in $(ps -aux | grep vlc  | awk '{ print $2 }'); do kill -9 $i; done

(සියළුම ක්‍රියාවලීන් vlc සමඟ ඔවුන්ගේ නමින් මරා දමනු ඇත)


1

git pullයාවත්කාලීනයක් සඳහා මගේ ව්‍යාපෘති රාශියක් හරහා මම ලූප :

#!/bin/sh
projects="
web
ios
android
"
for project in $projects do
    cd  $HOME/develop/$project && git pull
end

7
මෙම කේත ස්නිපටය මඟින් ප්‍රශ්නය විසඳිය හැකි අතර, පැහැදිලි කිරීමක් ඇතුළුව ඔබේ තනතුරේ ගුණාත්මකභාවය වැඩි දියුණු කිරීමට උපකාරී වේ. අනාගතයේ දී ඔබ පා readers කයන් සඳහා වන ප්‍රශ්නයට පිළිතුරු සපයන බව මතක තබා ගන්න, ඔබේ කේත යෝජනාවට හේතු එම පුද්ගලයින් නොදැන සිටිය හැකිය. කරුණාකර ඔබේ කේතය පැහැදිලි කිරීමේ අදහස් දැක්වීමට උත්සාහ නොකරන්න, මෙය කේතයේ කියවීමේ හැකියාව සහ පැහැදිලි කිරීම් අඩු කරයි!
kayess
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.