কমান্ডটি ব্যাশ ভেরিয়েবল অ্যাসাইনমেন্টে ত্রুটি খুঁজে পায় নি


519

আমার এই স্ক্রিপ্টটি টেস্ট.শ বলেছে:

#!/bin/bash
STR = "Hello World"
echo $STR

আমি যখন দৌড়ে sh test.shযাই তখন আমি এটি পাই:

test.sh: line 2: STR: command not found

আমি কি ভুল করছি? আমি অনলাইনে বেসিক / বেনার্স ব্যাশ স্ক্রিপ্টিং টিউটোরিয়ালগুলিকে দেখি এবং তারা ভেরিয়েবলগুলি ঘোষণার জন্য এইভাবে বলে ... সুতরাং আমি কী ভুল করছি তা আমি নিশ্চিত নই।

আমি উবুন্টু সার্ভার 9.10 এ আছি। এবং হ্যাঁ, বাশটি এখানে অবস্থিত /bin/bash


49
আপনি সন্তুষ্ট হয়ে প্রশ্নটি করেছেন, আমি খুশি, আপনি সেখানে কেবল বাশ নুব না!
মিলিরি গরিলা

6
এই প্রশ্ন জিজ্ঞাসা করার জন্য ধন্যবাদ। এটি বিব্রত হওয়ার মতো প্রশ্ন নয়। আমি অফিসে গভীর রাতে কাজ করছি এবং এর উত্তর দেওয়ার জন্য আমার চারপাশে কোনও বাশ বিশেষজ্ঞ নেই is
অ্যাডওয়ে লেলে

3
আজকাল (প্রায় সাত বছর পর!) একটা FOSS Linter / বিশ্লেষক নামক shellcheck যে এই এবং অন্যান্য সাধারণ সিনট্যাক্স বিষয় স্বতঃসনাক্ত হবে। এটি অনলাইনে ব্যবহার করা যেতে পারে বা অফলাইনে ইনস্টল করা যেতে পারে এবং আপনার সম্পাদককে সংহত করতে পারে।
সে অন্য লোকটি


: আমি ব্যবহার করতে বলতে চাই #!/usr/bin/env bashপরিবর্তে সরাসরি নির্বাণ #!/bin/bashযদি না আপনি একেবারে নিশ্চিত করুন যে আপনার করছি bashরয়েছে /bin: এই উত্তর কারণে stackoverflow.com/a/21613044/3589567
আলেহান্দ্রো Blasco

উত্তর:


927

আপনার '=' চিহ্নের আশেপাশে স্পেস থাকতে পারে না।

আপনি যখন লিখবেন:

STR = "foo"

বাশ 2 টি আর্গুমেন্ট (স্ট্রিং '=' এবং 'foo') দিয়ে এসআরটি নামে একটি কমান্ড চালানোর চেষ্টা করে

আপনি যখন লিখবেন:

STR =foo

বাশ 1 টি যুক্তি দিয়ে স্ট্রিং নামের একটি কমান্ড চালানোর চেষ্টা করে (স্ট্রিং '= foo')

আপনি যখন লিখবেন:

STR= foo

বাশ তার পরিবেশে খালি স্ট্রিংয়ের সাথে সেট সেট করে কমান্ড foo চালানোর চেষ্টা করে।

আমি নিশ্চিত নই যে এটি স্পষ্ট করতে সহায়তা করে বা এটি নিছক অবনতি হলে, তবে লক্ষ করুন:

  1. প্রথম কমান্ড ঠিক সমতূল্য: STR "=" "foo",
  2. দ্বিতীয়টি একই STR "=foo",
  3. এবং শেষটি সমান STR="" foo

শ ভাষা অনুচ্ছেদের প্রাসঙ্গিক বিভাগ , বিভাগ ২.৯.১ বলেছেন:

একটি "সিম্পল কমান্ড" হ'ল variচ্ছিক পরিবর্তনশীল অ্যাসাইনমেন্ট এবং পুনঃনির্দেশগুলির ক্রম, কোনও ক্রমে, বিকল্পভাবে শব্দ এবং পুনঃনির্দেশগুলি অনুসরণ করে, একটি নিয়ন্ত্রণ অপারেটর দ্বারা সমাপ্ত হয় ated

সেই প্রসঙ্গে, একটি wordহ'ল আদেশটি হ'ল বাশ চলমান। ধারণকারী কোন স্ট্রিং =যখন কোনো স্ট্রিং, যাতে একটি ফেরৎ নয় এবং ধারণ করে না যা ফেরৎ নয় (স্ট্রিং শুরুতে ছাড়া অন্য কোনো অবস্থানে), একটি পরিবর্তনশীল নিয়োগ হয় =একটি কমান্ড। ইন STR = "foo", STRএকটি পরিবর্তনশীল অ্যাসাইনমেন্ট নয়।


2
"-" এর সাথে সংযুক্তিযুক্ত নামের সাথে আপনার যদি ভেরিয়েবল থাকে তবে একই ত্রুটি ঘটে। সেক্ষেত্রে সমাধানটি "-"
chomp

1
chomp @ pubs.opengroup.org/onlinepubs/9699919799 এর 2.10.10 সেকশনের 7b বিধি অনুসারে "'=' এর আগের সমস্ত অক্ষর যদি একটি বৈধ নাম গঠন করে (এক্সবিডি নামটি দেখুন), টোকেন ASSIGNMENT_WORD ফিরে আসবে" " Pubs.opengroup.org/onlinepubs/9699919799 এর বিভাগ 3.231 এর লিঙ্কটি অনুসরণ করার পরে , আমরা "শেল কমান্ড ভাষায়, পোর্টেবল অক্ষর সেট থেকে পুরোপুরি আন্ডারস্কোর, অঙ্ক এবং বর্ণমালা সমন্বিত একটি শব্দ পাই a একটি নামের প্রথম অক্ষরটি হ'ল একটি সংখ্যা নয়। সুতরাং শব্দটি FOO-BAR=quxকোনও ভেরিয়েবল অ্যাসাইনমেন্ট নয় কারণ FOO-BARএটি কোনও বৈধ নাম নয়।
উইলিয়াম পার্সেল

2
আমি এই পরিষ্কার ব্যাখ্যাটি পুরষ্কারের জন্য একটি সর্বদা প্রচলিত সমস্যাটির জন্য নতুনদের জন্য প্রস্তাব দিচ্ছি (ভাল, এবং যখনই আমি এটি লিঙ্ক করতে চাই তখন তা দ্রুত খুঁজে পেতে সক্ষম হব: ডি)। এই জিনিস সহজ করার জন্য ধন্যবাদ!
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

1
@ ফেডরকিই ধন্যবাদ! আমি পুরোপুরি নিশ্চিত নই যে এটি একটি স্পষ্ট ব্যাখ্যা, এবং আমি প্রায়শই ভাবছি যে এটি আরও সহজ করা যায়।
উইলিয়াম পার্সেল 21

159

চিহ্নটির চারপাশে স্পেস ফেলে দিন =:

#!/bin/bash 
STR="Hello World" 
echo $STR 

9
এটি মজার, যদিও set foo = barউইন্ডোজ ব্যাচ ফাইলগুলিতেও একটি সাধারণ ভুল — এবং সেখানে ব্যাচের ভাষাটির জন্য এটি উপহাস করা হয় ;-)
জয়ে

ধন্যবাদ @ জোয়াই আমি একটি শেল স্ক্রিপ্ট লিখতে গিয়ে আটকে গিয়েছিলাম যেখানে আমি "=" এর পরে স্পেস দিয়ে ভেরিয়েবল শুরু করছিলাম। আপনি আমার দিন বাঁচিয়েছেন
ললিত রাও

বাশ কেন বাম মাঠে নম্বরগুলি গ্রহণ করে না? 3 = "হ্যালো ওয়ার্ল্ড" এর মতো এটি কমান্ড পাওয়া যায় নি বলে অভিযোগ করে
ফ্রিডো

6

ইন্টারেক্টিভ মোডে সবকিছু ঠিকঠাক দেখাচ্ছে:

$ str="Hello World"
$ echo $str
Hello World

স্পষ্টতই (!) জোহানেস বলেছিলেন, এর আশেপাশে কোনও স্থান নেই ==ইন্টারেক্টিভ মোডে তখন আশেপাশে কোনও স্থান থাকলে এটি ত্রুটিগুলি দেয়

কোনও কমান্ড 'str' পাওয়া যায় নি


2
তবে নোটটি ওপি বলছিলেন STR = "Hello World", সুতরাং এই উত্তরটি এখানে প্রয়োগ হয় না।
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

@Arkapravo কি ইন্টারেক্টিভ মোডে অর্থ, এটা কিছু কি আছে হয় $চিহ্ন
Kasun Siyambalapitiya

@ কাসুনসিয়াম্বলপিতিয়াকে "ইন্টারেক্টিভ মোড" দ্বারা বোঝানো হচ্ছে তার অর্থ হ'ল কমান্ডগুলি প্রকৃত টার্মিনালে টাইপ করা, কোনও স্ক্রিপ্টে নয়।
নম্বরমানিয়াক

5

আমি জানি এটি একটি খুব উচ্চ মানের উত্তর দিয়ে দেওয়া হয়েছে। তবে, সংক্ষেপে, আপনার স্পেস থাকতে পারে না।

#!/bin/bash
STR = "Hello World"
echo $STR

সমান চিহ্নের আশেপাশের জায়গাগুলির কারণে কাজ হয়নি। আপনি যদি চালানো হয় ...

#!/bin/bash
STR="Hello World"
echo $STR

এটা কাজ করবে


2

আপনি যখন কোনও ভেরিয়েবল সংজ্ঞায়িত করেন তখন আপনাকে কোনও অতিরিক্ত স্পেস রাখতে হবে না।

যেমন

name = "Stack Overflow"  
// it is not valid, you will get an error saying- "Command not found"

সুতরাং স্পেসগুলি সরান:

name="Stack Overflow" 

এবং এটা ঠিক কাজ করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.