bash - لماذا يعطي البرنامج النصي shell أخطاء في بناء الجملة عندما يعمل نفس الرمز في مكان آخر؟



carriage-return (1)

TL؛ DR: يحتوي البرنامج النصي على نهايات سطر CRLF بنمط Windows ، ويعرف أيضًا باسم \r\n .

تحويل إلى نمط Unix \n عن طريق حذف عائدات النقل.

كيف أتحقق مما إذا كان النص البرمجي له عائدات النقل؟

يمكن اكتشافها كـ ^M في إخراج البرنامج cat -v yourscript الخاص بـ cat -v yourscript :

$ cat -v myscript
if true^M
then^M
  true^M
...

كيف يمكنني إزالتها؟

قم بتعيين المحرر الخاص بك لحفظ الملف باستخدام نهايات خطوط Unix ، والمعروفة أيضًا باسم "أطراف نهاية السطر" أو "أحرف نهاية السطر" ، وقم بإعادة حفظه.

يمكنك أيضًا إزالتها من سطر الأوامر باستخدام dos2unix yourscript أو cat yourscript | tr -d '\r' > fixedscript cat yourscript | tr -d '\r' > fixedscript .

لماذا تتسبب عمليات إرجاع النقل في حدوث أخطاء في بناء الجملة؟

حرف الإرجاع حرف هو مجرد حرف آخر للباش. then لم يكن هو نفسه كما كان then\r ، لذلك لا يتعرف bash عليها ككلمة رئيسية ويفترض أنها أمر. ثم يبقى البحث عن then وفشل

إذا حدث أن تكون هناك مساحة زائدة بعد then ، فستواجه مشكلة مماثلة لـ fi .

هذا السؤال لديه بالفعل إجابة هنا:

لديّ نص برمجي بسيط قمت بنسخه من نص برمجي عملي. تعمل إذا قمت بنسخها إلى محطة طرفية

if true
then
  true
fi 

ومع ذلك ، عندما أقوم بتشغيل البرنامج النصي باستخدام bash myscript ، تظهر لي أخطاء بناء جملة مختلفة كما لو أن بعض الكلمات الأساسية مفقودة.

  • myscript: line 4: syntax error near unexpected token `fi' ، كما لو لم يكن موجودًا.
  • myscript: line 6: syntax error: unexpected end of file ، كما لو لم يكن fi موجودًا.
  • myscript: line 4: syntax error near unexpected token `$'\r' .. ماذا؟

لماذا يحدث هذا في هذا البرنامج النصي المحدد ، ولكن ليس في سطر الأوامر الخاص بي أو في البرنامج النصي الذي نسخت منه؟





carriage-return