لماذا تتكرر طباعة Bourne Shell عبر وسيطة %s؟

StackOverflow https://stackoverflow.com/questions/42070

  •  09-06-2019
  •  | 
  •  

سؤال

ما الذي يحدث هنا؟

برينتف.ش:

#! /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}، فسيتم إخراج السلسلة ثلاث مرات باستخدام الوسائط المختلفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top