bash حدث - كيفية التكرار عبر الوسيطات في البرنامج النصي باش




3 Answers

استخدم "[email protected]" لتمثيل جميع الوسيطات:

for var in "[email protected]"
do
    echo "$var"
done

سيتكيف هذا مع كل وسيطة ويطبعه على سطر منفصل. يتصرف $ @ مثل $ * إلا أنه عند الاقتباس يتم فصل الحجج بشكل صحيح إذا كانت هناك مسافات فيها:

sh test.sh 1 2 '3 4'
1
2
3 4
خطأ حل

لدي أمر معقد أود كتابة نص برمجي به. يمكنني كتابته من حيث $1 بسهولة:

foo $1 args -o $1.ext

أريد أن أتمكن من تمرير أسماء مدخلات متعددة إلى البرنامج النصي. ما هي الطريقة الصحيحة لفعل ذلك؟

وبالطبع ، أريد التعامل مع أسماء الملفات مع مسافات فيها.




لاحظ أن إجابة روبرت صحيحة ، وأنها تعمل في sh كذلك. يمكنك (بشكل مؤقت) تبسيطها بشكل أكبر:

for i in "[email protected]"

ما يعادل:

for i

أي أنك لست بحاجة إلى أي شيء!

اختبار ( $ هو موجه الأوامر):

$ set a b "spaces here" d
$ for i; do echo "$i"; done
a
b
spaces here
d
$ for i in "[email protected]"; do echo "$i"; done
a
b
spaces here
d

قرأت لأول مرة عن هذا في بيئة برمجة Unix بواسطة Kernighan و Pike.

في bash ، help for المستندات:

for NAME [in WORDS ... ;] do COMMANDS; done

إذا كان 'in WORDS ...;' غير موجود ، ثم 'in "[email protected]"' يفترض.




يمكنك أيضًا الدخول إليها كعناصر صفيف ، على سبيل المثال إذا كنت لا تريد التكرار من خلال جميع العناصر

argc=$#
argv=([email protected])

for (( j=0; j<argc; j++ )); do
    echo ${argv[j]}
done



Related

bash command-line