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