لماذا يقوم شيل بورن بتكرار الـ 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 في سكربتك بثقة للحصول على مخرجات نظيفة ومحكمة!

من خلال اتباع هذه الممارسات الجيدة، ستجد نفسك تصنع سكربتات شيل أكثر قوة وموثوقية.