لماذا تتكرر طباعة Bourne Shell عبر وسيطة %s؟
سؤال
ما الذي يحدث هنا؟
برينتف.ش:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" $NAME
جلسة سطر الأوامر:
$ ./printf.sh
Hello, George
Hello, W.
Hello, Bush
تحديث: printf "Hello, %s\n" "$NAME"
يعمل.لماذا لا أستخدم echo
, ، يعتبر
صدى.ش:
#! /bin/sh
FILE="C:\tmp"
echo "Filename: $FILE"
سطر الأوامر:
$ ./echo.sh
Filename: C: mp
ال مواصفات POSIX لـ echo
يقول: "يتم تشجيع التطبيقات الجديدة على الاستخدام printf
بدلاً من echo
"(لهذا ولأسباب أخرى).
المحلول
يتم استبدال متغير NAME الخاص بك على النحو التالي:
printf "Hello, %s\n" George W. Bush
استخدم هذا:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" "$NAME"
نصائح أخرى
هل هناك سبب محدد لاستخدامك printf أم أن صدى الصوت سيعمل معك أيضًا؟
NAME="George W. Bush"
echo "Hello, "$NAME
النتائج في
Hello, George W. Bush
يحرر:السبب وراء تكرارها على "جورج دبليو بوش".بوش" لأن قذيفة بورن محددة بمساحة.للاستمرار في استخدام printf، عليك وضع $NAME بين علامتي اقتباس مزدوجتين
printf "Hello, %s\n" "$NAME"
الطريقة التي أفسر بها صفحة الرجل هل تعتبر السلسلة التي تمررها وسيطة؟إذا كانت السلسلة الخاصة بك تحتوي على مسافات، فهذا يعني أنك تقوم بتمرير وسائط متعددة.أعتقد أن ColinYounger على صواب من خلال إحاطة المتغير بعلامات اقتباس، مما يفرض على الصدفة تفسير السلسلة كوسيطة واحدة.
قد يكون البديل هو السماح لـ printf بتوسيع المتغير:
printf "Hello, $NAME."
الروابط مخصصة لـ bash، لكنني متأكد من أن الأمر نفسه ينطبق على sh.
إذا كنت تريد أن تتم طباعة كل هذه الكلمات بمفردها، فاستخدم مطبعة بدلاً من printf
printf يأخذ مواصفات التنسيق ويطبقها على كل وسيطة تقوم بتمريرها.نظرًا لأن لديك ثلاث وسيطات {George, W., Bush}، فسيتم إخراج السلسلة ثلاث مرات باستخدام الوسائط المختلفة.