لم يتم العثور على خطأ في مهمة متغير Bash
-
20-09-2019 - |
سؤال
لدي هذا البرنامج النصي يسمى test.sh:
#!/bin/bash
STR = "Hello World"
echo $STR
عندما أركض sh test.sh
أحصل على هذا:
test.sh: line 2: STR: command not found
ما الخطأ الذي افعله؟ إنني أنظر إلى البرامج التعليمية البرمجية الأساسية/المبتدئين على الإنترنت ، وهكذا يقولون أن يعلنوا المتغيرات ... لذلك لست متأكدًا مما أفعله خطأ.
أنا على خادم Ubuntu 9.10. ونعم ، يقع باش في /bin/bash
.
المحلول
لا يمكن أن يكون لديك مسافات حول علامة '='.
عندما تكتب:
STR = "foo"
يحاول باش تشغيل أمر يدعى Str مع وسيطتين (الأوتار "=" و "فو")
عندما تكتب:
STR =foo
يحاول باش تشغيل أمر يدعى STR مع وسيطة واحدة (السلسلة "= Foo")
عندما تكتب:
STR= foo
يحاول Bash تشغيل Command Foo مع ضبط STR على السلسلة الفارغة في بيئتها.
لست متأكدًا مما إذا كان هذا يساعد على توضيح أو إذا كان مجرد تعبئة ، ولكن لاحظ أن:
- الأمر الأول يعادل بالضبط:
STR "=" "foo"
, - والثاني هو نفسه
STR "=foo"
, - والأخير يعادل
STR="" foo
.
القسم ذي الصلة من SH لغة SP ، القسم 2.9.1 تنص على:
"الأمر البسيط" هو سلسلة من المهام المتغيرة الاختيارية وإعادة التوجيه ، بأي تسلسل ، تليها اختياريا الكلمات وإعادة الاتجاه ، التي تم إنهاءها بواسطة مشغل تحكم.
في هذا السياق ، أ word
هو الأمر الذي سوف يعمل باش. أي سلسلة تحتوي =
(في أي موضع آخر غير بداية السلسلة) وهو ليس إعادة توجيه هو مهمة متغيرة ، في حين أن أي سلسلة لا تعتبر إعادة توجيه ولا تحتوي على =
هو أمر. في STR = "foo"
, STR
ليست مهمة متغيرة.
نصائح أخرى
إسقاط المسافات حول =
وقع:
#!/bin/bash
STR="Hello World"
echo $STR
في الوضع التفاعلي ، يبدو كل شيء على ما يرام
$ str="Hello World"
$ echo $str
Hello World
بشكل ملحوظ ! كما قال يوهانس ، لا مساحة حول '='. في حالة وجود أي مساحة حول '=' ثم في الوضع التفاعلي ، فإنه يعطي أخطاء مثل ``
لم يتم العثور على أمر "Str"
أعلم أن هذا قد تمت الإجابة عليه بإجابة عالية الجودة. ولكن ، باختصار ، لا يمكنك الحصول على مساحات.
#!/bin/bash
STR = "Hello World"
echo $STR
لم تعمل بسبب المساحات حول العلامة المتساوية. إذا كنت تريد الجري ...
#!/bin/bash
STR="Hello World"
echo $STR
سوف تعمل
عندما تحدد أي متغير ، فلن تضطر إلى وضع أي مساحات إضافية.
على سبيل المثال
name = "Stack Overflow"
// it is not valid, you will get an error saying- "Command not found"
لذا قم بإزالة المساحات:
name="Stack Overflow"
وسوف تعمل بشكل جيد.