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



8 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.

arrays bash shell unix

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

شيء مثل:

for databaseName in listOfNames
then
  # Do something
end



بنفس روح إجابة 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. استغرق الأمر مني عدة أشهر لمعرفة كيفية رمز هذا ببساطة :)

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




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

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

#Loop
for Path in "${FilePath[@]}"
do
    echo "$Path"
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



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



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

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

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



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

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

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

db_a
db_b
db_c



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

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





Related