বাশ: খারাপ সাবস্টিটিউশন


148
#!/bin/bash

jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}

এই বাশ স্ক্রিপ্টটি আমাকে উবুন্টুতে খারাপ প্রতিস্থাপনের ত্রুটি দেয় । যে কোনও সাহায্যের প্রশংসা করা হবে।


এটা আমার ভাল কাজ করছে। তুমি অর্জন করার জন্য কি চেষ্টা করতেছ?
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

আমি চাকরির নাম দুটি ভাগে ভাগ করার চেষ্টা করছি: জব_201312161447 এবং 0003 Its এটি উবুন্টুতে চালানোর চেষ্টা করার সময়ই এই ত্রুটিটি দেওয়া হচ্ছে।
অরিন্দম চৌধুরী

মমমম আজব। আপনি যদি ব্যবহার করেন cut? cut -d_ -f1,2 <<< "$jobname"এবং cut -d_ -f3 <<< "$jobname"এটি তৈরি করুন
ফেডোরকুই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

ধন্যবাদ। তবে কেন কাজের নাম_প্রেম = $ {কাজের নাম: 0: 16 error ত্রুটি দিয়েছে
অরিন্দম চৌধুরী

1
@ ব্লগার আপনি ঠিক বলেছেন, আমি দেখতে পাচ্ছি যে এটি করলে sh script.shএটি একটি "খারাপ প্রতিস্থাপন" ত্রুটি পায়।
ফেডোরকুই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

উত্তর:


200

/bin/shউবুন্টুর অধীনে ডিফল্ট শেল ( ) নির্দেশ করে dash, না bash

me@pc:~$ readlink -f $(which sh)
/bin/dash

সুতরাং যদি আপনি chmod +x your_script_file.shএবং তারপরে এটি চালান ./your_script_file.sh, বা আপনি যদি এটি দিয়ে চালান তবে bash your_script_file.shএটি ঠিকঠাক কাজ করা উচিত।

এটি দিয়ে চালানো কার্যকর sh your_script_file.shহবে না কারণ হ্যাশবাং লাইন উপেক্ষা করা হবে এবং স্ক্রিপ্টটির দ্বারা ব্যাখ্যা করা হবে dash, যা স্ট্রিং প্রতিস্থাপন সিনট্যাক্স সমর্থন করে না।


2
তিনি /bin/bashআপনার ব্যবহারের উপযুক্ত না খায় তাই ব্যবহার করছেন ?! তিনি কোথায় ব্যবহার করছেন /bin/shবা কোথায় পড়বেন sh script.sh?
ড্যানিয়েল ডাব্লু।

4
@ ড্যানফ্রমগ্রামী কারণ এই ত্রুটির একমাত্র কারণ, তিনি স্ক্রিপ্টটি এমনভাবে চালাচ্ছেন যা হ্যাশব্যাংকে বিবেচনা করে না এবং বাশ বাক্য গঠনটি অন্য কোনও শেল দ্বারা সমর্থিত নয় (সম্ভবত ড্যাশ)। প্রশ্নগুলিতে সর্বদা প্রয়োজনীয় সমস্ত বিবরণ থাকে না এবং আমাদের অবশ্যই বিন্দুগুলিতে যোগ দিতে হবে ... যাইহোক আমার উত্তর নিচে নির্দ্বিধায় বোধ করা উচিত।
ভ্যানি তোতারো

2
আমার ডাউনটা দরকার নেই আমার একই ত্রুটি বার্তা রয়েছে bad substitutionএবং আমি কেবল তথ্য সংগ্রহ করার চেষ্টা করছি তবে এই প্রশ্নটি সাহায্য করে না কারণ এতে খুব কম তথ্য রয়েছে।
ড্যানিয়েল ডাব্লু।

2
@ ড্যানফ্রমজার্মি আপনি নিজের প্রশ্ন পোস্ট করার চেষ্টা করতে পারেন, সম্ভবত এটি ঠিক একই সমস্যা নয়।
ভ্যানি তোতারো

69

আমারও একই সমস্যা ছিল। আপনার স্ক্রিপ্টটি নেই তা নিশ্চিত করুন

#!/bin/sh 

আপনার স্ক্রিপ্ট শীর্ষে। পরিবর্তে, আপনি যোগ করা উচিত

#!/bin/bash

5
আমি ব্যবহার করেছি #!bin/bashএবং sh script.sh, এটি এখনও আমাকে ত্রুটির বার্তা দিয়েছে। তারপরে ./script.shকাজ করে।
হোয়াইসইউং

যদি আপনার ফাইলটি শীর্ষে একটি শেবাং অনুপস্থিত থাকে তবে #!/bin/bashএটি খারাপ বদলিও ঠিক করবে ।
জেমি

1
@Wyisyoung আপনার পরিবর্তনশীলটির নামে একটি বিন্দু (।) রাখা হতে পারে। এটি খারাপ পদার্থ দেয়। ত্রুটি.
ব্যবহারকারী 13107

4
@Wyisyoung #!লাইনটি তখনই ব্যবহার করা হবে যখন আপনি সরাসরি আপনার স্ক্রিপ্টটি কার্যকর করেন। আপনি যদি sh script.shলাইনটি ব্যবহার করেন তবে তা সম্পূর্ণ উপেক্ষা করা হবে।
bfontaine

35

এখানে উপস্থিত অন্যদের জন্য, কমান্ডগুলির জন্য env ভেরিয়েবল সিনট্যাক্স ব্যবহার করার সময় এই সঠিক বার্তাটি উপস্থিত হবে, উদাহরণস্বরূপ ${which sh}সঠিকটির পরিবর্তে$(which sh)


21

আপনার স্ক্রিপ্ট সিনট্যাক্স বৈধ বাশ এবং ভাল।

ব্যর্থতার সম্ভাব্য কারণগুলি:

  1. আপনার bashআসলে বাশ নয় তবে kshবা অন্য কোনও শেল যা বাশের প্যারামিটারের বিকল্প বুঝতে পারে না। কারণ আপনার স্ক্রিপ্টটি দেখতে দুর্দান্ত এবং ব্যাশের সাথে কাজ করে। কি ls -l /bin/bashএবং এটি সত্যিই ব্যাশ এবং কিছু অন্যান্য শেল না sym সংযুক্ত চেক করুন।

  2. যদি আপনার সিস্টেমে বাশ থাকে, তবে আপনি আপনার স্ক্রিপ্টটি ভুল উপায়ে চালাতে পারেন যেমন: ksh script.shবা sh script.sh(এবং আপনার ডিফল্ট শেল ব্যাশ নয়)। আপনার যেহেতু যথাযথ শেবাং রয়েছে, যদি আপনার বাশ থাকে ./script.shবা bash ./script.shভাল থাকে।


7
আমি /bin/bash( অবাক /bin/sh) কখনও অন্য শেলের সাথে যুক্ত থাকলে অবাক হব ।
চেপনার

ksh আসলে যেখানে বাশের সিনট্যাক্স এক্সটেনশনের বেশিরভাগ থেকেই উদ্ভূত হয়েছিল; এটিতে অবশ্যই নির্দিষ্ট প্যারামিটার সম্প্রসারণ সিনট্যাক্স রয়েছে। সক্ষম হওয়ার সম্ভাবনা কম বলে আমি এটিকে কল করার পরামর্শ দিই না।
চার্লস ডাফি

7

স্ক্রিপ্টটি কেবল এক্সিকিউটেবল হিসাবে চালিত করার পরিবর্তে ব্যাশ কমান্ড ব্যবহার করে স্পষ্টভাবে চালনার চেষ্টা করুন।


3
ভাল একটা. এটি আরও স্পষ্ট করে তুলতে কিছু নমুনা আউটপুট যুক্ত করা সহায়ক হবে, এটি ব্যবহার করে sh scriptএবং bash script... আমার পরামর্শ :)
ফেডোরকি 'SO ক্ষতিগ্রস্থ করা বন্ধ করুন'

4

এছাড়াও, আপনার স্ক্রিপ্টের প্রথম লাইনের জন্য আপনার খালি স্ট্রিং না রয়েছে তা নিশ্চিত করুন।

অর্থাত #!/bin/bashআপনার স্ক্রিপ্টের প্রথম লাইনটি নিশ্চিত করুন ।


3

আপনার উদাহরণের সাথে প্রাসঙ্গিক নয়, তবে আপনি Bad substitutionযে কোনও প্রতিস্থাপন সিনট্যাক্স যা বাশকে স্বীকৃতি দেয় না তার জন্য আপনি ত্রুটি পেতে পারেন get এটা হতে পারত:

  • স্ট্রে হোয়াইটস্পেস যেমনbash -c '${x }'
  • একটি ছাপাখানা. যেমনbash -c '${x;-}'
  • একটি বৈশিষ্ট্য যা পরবর্তী বাশ সংস্করণে যুক্ত হয়েছিল। উদাহরণস্বরূপ bash -c '${x@Q}'4.4 বাশের আগে

যদি আপনার একই অভিব্যক্তিতে একাধিক বিকল্প থাকে তবে ব্যাশ সমস্যাযুক্ত অভিব্যক্তিটি চিহ্নিত করতে খুব সহায়ক হতে পারে না। উদাহরণ:

$ bash -c '"${x } multiline string
$y"'
bash: line 1: ${x } multiline string
$y: bad substitution

2
এটি প্রথম হিট Bad substitutionতাই আমি ভেবেছিলাম যে আমরা যে কেসটি চালিয়েছি তা অন্তর্ভুক্ত করব। (এটি @Qদীর্ঘ বহু-লাইন প্রকাশে লুকিয়ে 4.3 বাশে ছিল Bash)
ড্যানিয়েল দারাবস


2
Prooflink সংক্রান্ত @Qমধ্যে যোগ করা হচ্ছে bash-4.4
এক্স-ইউরি

2

উভয় - বাশ বা ড্যাশ - কাজ করে তবে বাক্য গঠনটি হওয়া দরকার:

FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new

1
এটি সম্পূর্ণ ভিন্ন অপারেশন। এছাড়াও, যেহেতু ওপি লো-কেস ভেরিয়েবলের নাম ব্যবহার করে ভাল অনুশীলনগুলি অনুসরণ করছিল (দেখুন pubs.opengroup.org/onlinepubs/9699919799/basedefs/… - বড় হাতের নামগুলি ওএস বা শেলের সাথে ভেরিয়েবলের জন্য ব্যবহৃত হয়; ছোট হাতের নামগুলি অ্যাপ্লিকেশন ব্যবহারের জন্য সংরক্ষিত), এটি একইভাবে করণীয়।
চার্লস ডাফি

0

দেখে মনে হচ্ছে "+ x" সমস্যার কারণ:

root@raspi1:~# cat > /tmp/btest
#!/bin/bash

jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
root@raspi1:~# chmod +x /tmp/btest
root@raspi1:~# /tmp/btest
root@raspi1:~# sh -x /tmp/btest
+ jobname=job_201312161447_0003
/tmp/btest: 4: /tmp/btest: Bad substitution

0

বাশগুলিতে কোঁকড়ানো ধনুর্বন্ধনী সহ আমি একটি প্রকাশে দুবার ডলার চিহ্ন যুক্ত করছিলাম:

cp -r $PROJECT_NAME ${$PROJECT_NAME}2

পরিবর্তে

cp -r $PROJECT_NAME ${PROJECT_NAME}2

-1

আমি খুঁজে পেয়েছি যে এই সমস্যাটি হয় চিহ্নিত উত্তর দ্বারা হয় বা বাশ ঘোষণার আগে আপনার কাছে একটি লাইন বা স্পেস রয়েছে

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