[arrays] حلقة من خلال مجموعة من السلاسل في باش؟


Answers

هذا ممكن ، بالطبع.

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

انظر Bash Loops for، while and until for details.

Question

أريد أن أكتب السيناريو الذي الحلقات من خلال 15 سلاسل (صفيف ربما؟) هل هذا ممكن؟

شيء مثل:

for databaseName in listOfNames
then
  # Do something
end



أتصفح من خلال مجموعة من المشاريع الخاصة بي لتحديث git pull :

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



حلقات خط واحد ،

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

ستحصل على مخرجات كهذه ،

db_a
db_b
db_c



هذا أيضا سهل القراءة:

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

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



بنفس روح إجابة 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. يمكن تحديد "فاصل الحقل إلى السطر" الخاص بـ "bash IFS " في البرنامج النصي للسماح بالمسافات البيضاء الأخرى (مثل IFS='\n' أو لـ MacOS IFS='\r' )
  2. أنا أحب الإجابة المقبولة أيضا :) - لقد قمت بتضمين هذه المقتطفات كوسائل أخرى مفيدة أيضا أن الإجابة على السؤال.
  3. ويشير تضمين #!/bin/bash في أعلى ملف البرنامج النصي إلى بيئة التنفيذ.
  4. استغرق الأمر مني عدة أشهر لمعرفة كيفية رمز هذا ببساطة :)

مصادر أخرى ( أثناء قراءة الحلقة )




يشبه هذا إجابة user2533809 ، ولكن سيتم تنفيذ كل ملف كأمر منفصل.

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

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



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



لا يعمل صف التصريح لـ shell Korn. استخدم المثال أدناه لصندوق Korn:

promote_sla_chk_lst="cdi xlob"

set -A promote_arry $promote_sla_chk_lst

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



Related