سؤال

يبدو أن الكثير من رمز SH:

$cmd
if [ $? = 0 ]; then $cmd2; fi

بدلاً من:

if $cmd; then $cmd2; fi

لقد افترضت عادة أن الناس يستخدمون الأول ببساطة لأنهم غير مدركين أن بناء جملة الأخير صالح ، لكنني أتساءل عما إذا كان هناك سبب آخر (على الرغم من أن الاحتمال الوحيد الذي يتبادر إلى الذهن هو قابلية النقل). هل هناك أي سبب يفضل الإشارة بشكل صريح إلى $ {؟}؟.

هل كانت مفيدة؟

المحلول

عليك أن تشير $? إذا كنت ترغب بالفعل في استخدام رمز الخطأ لشيء ما (التسجيل ، والتعامل مع الأخطاء المتوقعة ، وما إلى ذلك). للسيناريو المعين الذي ذكرته ، والثاني if البناء أكثر وضوحًا وأقصر ، ولا أرى أي سبب لعدم استخدامه.

نصائح أخرى

في رأيي ، لأن الكثير من الناس لا يدركون أنه يمكنك اختبار حالة الأمر أكثر أو أقل كما تفعل. وبالمثل ، لا يدرك الناس أيضًا أنه يمكنك الكتابة:

if cmd1
   cmd2
   cmd3
then
    ...do this after executing cmd1, cmd2 and cmd3, but ...
    ...only if cmd3 exits with with status 0!
fi

يمكنك أيضًا تبسيط التعليمات البرمجية الخاصة بك (بتكلفة terseness) إلى:

cmd1 && cmd2

(أرى أن shin لاحظت هذا في تعليق ، لقد قمت بتثبيته).

أرى أيضًا الكثير من كود شل "بورن" الذي يستخدم:

if ( ... )
then ...
fi

في بعض الأحيان يكون هذا مناسبًا - ولكن في أغلب الأحيان ، كتب مبرمج C Shell لا يدرك أن التدوين يعني "تشغيل قشرة فرعية" في قذيفة بورن ومشتقات - مثل Korn Shell ، والقذائف المتوافقة مع Posix ، و Bash.

لأنك تختبر علامة حالة الأمر ، بدلاً من اختبار الإخراج من الأمر.

إذا طبع الأمر إلى stdout ، ولكنه يحدد علامة ، فستحصل على نتائج مختلفة مع المثالين اللذين قدمتهما.

أقف تصحيحها ، بعد اختباره. اعتقدت أنني تذكرت أن أواجه مشكلة منذ سنوات على Solaris (تحت KSH؟) ، لكن لا يمكنني إعادة إنشاء الآلات التي يمكنني الوصول إليها حاليًا باستثناء الاختبار:

لو [ $cmd ]

نعم لا يعرف الكثير من الناس عن الشكل الأخير الأكثر أناقة. لقد ذكرت هذا سابقًا في:http://www.pixelbeat.org/programming/shell_script_mistakes.html

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