বর্ণমালা সহ লুপের জন্য


12

এটি ওএসএক্সে পুরোপুরি কাজ করে

#!/bin/bash
chars=( {a..z} )
n=3
for ((i=0; i<n; i++))
do
  echo "${chars[i]}"
done

তবে আমি যখন এটি উবুন্টুতে চালাচ্ছি তখন আমি নিম্নলিখিত ত্রুটিটি পেয়েছি।

ForLoopAlphabetTest.sh: 2: ForLoopAlphabetTest.sh: Syntax error: "(" unexpected

আমি সমস্যাটি সমাধান করার চেষ্টা করতে পারি না। কোনও পরামর্শ?


2
এটি উবুন্টুতে কাজ করে।
পাইলট 6

আমি এটি স্ক্রিপ্ট হিসাবে 16.04 বাশ 4.3 এ কাজ করতে পারি না। তবে এটি কাজ করে যদি আমি এটি টার্মিনালে কপি করি।
denski

উত্তর:


25

সম্ভবত আপনি স্ক্রিপ্টটি চালাচ্ছেন:

sh ForLoopAlphabetTest.sh

উবুন্টু সালে shসিমলিঙ্ক হয় dash; যেমন dashঅ্যারের কোনও ধারণা নেই, আপনি এর জন্য সিনট্যাক্স ত্রুটি পেয়ে যাচ্ছেন (

স্ক্রিপ্টটি পুরোপুরি কাজ করে bash, সুতরাং আপনি যদি এটির bashযুক্তি হিসাবে চালনা করেন তবে ঠিক হবে :

bash ForLoopAlphabetTest.sh

এখন, আপনার bashস্ক্রিপ্টে শেবাং রয়েছে, যাতে আপনি স্ক্রিপ্টটি কার্যকর ( chmod u+x ForLoopAlphabetTest.sh) তৈরি করতে পারেন এবং এটি চালিয়ে যান :

/path/to/ForLoopAlphabetTest.sh

বা স্ক্রিপ্টের ডিরেক্টরি থেকে:

./ForLoopAlphabetTest.sh

আরও মনে রাখবেন যে, আপনার স্ক্রিপ্টটিতে ব্রেস প্রসারণ {a..z}এবং সি-স্টাইলের বিল্ড রয়েছে for: for (( ... ))যা দ্বারা সমর্থিত নয় dash; সুতরাং যদি আপনার লক্ষ্যটি বহনযোগ্যতা হয় তবে আপনার shকেবল পসিক্স বাক্যবিন্যাসের দিকে নজর দেওয়া উচিত ।


ধন্যবাদ. ড্যাশের অ্যারের ধারণার অভাবকে কীভাবে বাধা দেবে?
denski

3
@ ডেনস্কি আপনি যদি কোনও পোর্টেবল স্ক্রিপ্ট লিখতে চান যা /bin/shকোনও ইউনিক্সের মতো অপারেটিং সিস্টেমে চালিত হতে পারে তবে আপনি অ্যারে ব্যবহার করতে পারবেন না। বাশ (এবং কিছু অন্যান্য শেল) এগুলি যুক্ত করেছে কারণ তারা খুব সুবিধাজনক এবং সর্বদা সহজেই আরও বেশি পোর্টেবল কোডের সাথে প্রতিস্থাপন করা যায় না। তবে বিশেষত আপনার স্ক্রিপ্টের জন্য, আপনি কোনও ঝামেলা ছাড়াই এবং কোনও বাশ-নির্দিষ্ট বৈশিষ্ট্য ব্যবহার না করে এটি করতে পারেন। আপনি কীভাবে তা করতে আগ্রহী?
এলিয়াহ কাগন

আপনার যদি কিছু পড়ার পরামর্শ দেওয়া হয় তবে তা সহায়ক হবে। ধন্যবাদ।
denski

1
@ ডেনস্কি আমি একটি উত্তর পোস্ট করেছি যাতে কয়েকটি লিঙ্ক এবং উদাহরণ রয়েছে। এখানে আমার আগের মন্তব্যে, আমি আপনাকে লুপগুলির জন্য অ্যারে এবং সি-স্টাইল ব্যবহারের কথা উল্লেখ করেছি কিন্তু ব্রেস সম্প্রসারণের আপনার ব্যবহারের কথা উল্লেখ করি নি। আমার উত্তরটি তিনটি ছাড়া কীভাবে করবেন তা কভার করে। মনে রাখবেন যে এই উত্তরটি (অর্থাত্ হিমাইলের, আমার নয়) আপনার সমস্যার প্রাথমিক সমাধান; খনি আপনি কীভাবে আপনার স্ক্রিপ্টটি পুনরায় লিখতে পারেন সেদিকে দৃষ্টি নিবদ্ধ করে যদি আপনি ব্যাশ-নির্দিষ্ট বৈশিষ্ট্যগুলিতে নির্ভর করতে না পারেন।
এলিয়াহ কাগন

@ হেইমাইল রেকর্ডের জন্য, আমি যুক্ত করতে চেয়েছিলাম যে আপনার অনুমানের মধ্যে আমি সঠিক ছিলাম যে আমি স্ক্রিপ্টগুলি চালিয়ে sh
যাচ্ছিলাম

10

আপনার স্ক্রিপ্টে বাশ শেলের তিনটি বৈশিষ্ট্য ব্যবহার করা হয়েছে যা সমস্ত বোর্ন-স্টাইলের শেলগুলি সরবরাহ করে না। হিমাইল যেমন বলে , আপনি সহজেই bashপরিবর্তে সেই স্ক্রিপ্টটি চালাতে পারেন sh। তোমার hashbang শীর্ষ (লাইনে #!/bin/bash) নির্দিষ্ট করে bashকিন্তু শুধুমাত্র কার্যকর যদি তুমি চালানো , স্ক্রিপ্ট হিসাবে heemayl ব্যাখ্যা । আপনাকে স্ক্রিপ্টের নাম পাস যদি sh, shস্বয়ংক্রিয়ভাবে কল করা হবে না bash, কিন্তু কেবল স্ক্রিপ্ট চালানো হবে। এটি কারণ আপনার স্ক্রিপ্টটি আসলে চলার পরে হ্যাশবাং লাইনের কোনও প্রভাব নেই

আপনার অন্যান্য বিকল্প, যদি আপনাকে ব্যাশ বৈশিষ্ট্যগুলির উপর নির্ভর করে না এমন পুরোপুরি পোর্টেবল স্ক্রিপ্টগুলি লেখার প্রয়োজন হয় তবে আপনার স্ক্রিপ্টটি পরিবর্তন করা যাতে এটি ছাড়া এটি কাজ করে। আপনার ব্যবহৃত বাশ বৈশিষ্ট্যগুলি হ'ল:

বিশেষত উবুন্টুর মতো জিএনইউ / লিনাক্স সিস্টেমগুলিতে ব্যাশ ব্যাপকভাবে উপলব্ধ এবং ম্যাকোস এবং অন্যান্য অনেক সিস্টেমেও উপলব্ধ। আপনি বাশ-সুনির্দিষ্ট বৈশিষ্ট্যগুলি কতটা ব্যবহার করছেন তা বিবেচনা করে আপনি আপনার স্ক্রিপ্টগুলি চালানোর সময় কেবল বাশ (বা এমন কোনও শেল যা আপনি ব্যবহার করছেন এমন বৈশিষ্ট্যগুলি সমর্থন করে) ব্যবহার করছেন make

তবে আপনি যদি চান তবে পোর্টেবল কনস্ট্রাক্টের সাহায্যে এগুলি প্রতিস্থাপন করতে পারেন। অ্যারে এবং সি স্টাইলের forলুপটি প্রতিস্থাপন করা সহজ; ধনুর্বন্ধনী প্রসার ছাড়াই অক্ষরের পরিসর তৈরি করা (এবং আপনার স্ক্রিপ্টে এগুলি হার্ড-কোডিং ছাড়াই) হ'ল এক অংশ যা সামান্য জটিল।


প্রথমে, এখানে এমন একটি স্ক্রিপ্ট রয়েছে যা সমস্ত নিম্ন-বর্ণিত লাতিন অক্ষর মুদ্রণ করে:

#!/bin/sh

for i in $(seq 97 122); do
    printf "\\$(printf %o $i)\n"
done

এটি বেশিরভাগ ইউনিক্স-মতো সিস্টেমে পোর্টেবল এবং আপনি কোন বোর্ন-স্টাইল শেল ব্যবহার করেন তা নির্ভর করে না। তবে কয়েকটি ইউনিক্স-মতো সিস্টেমে seqডিফল্টরূপে ইনস্টল করা হয়নি ( jotপরিবর্তে তারা ব্যবহারের প্রবণতা রয়েছে , যা বেশিরভাগ জিএনইউ / লিনাক্স সিস্টেমে ইনস্টল করা হয় না) is আপনি exprবহন করার প্রয়োজন হলে আরও বহনযোগ্যতা বাড়াতে আপনি পাটিগণিত প্রতিস্থাপনের সাথে একটি লুপ ব্যবহার করতে পারেন :

#!/bin/sh

i=97
while [ $i -le 122 ]; do
    printf "\\$(printf %o $i)\n"
    i=$((i + 1))
done

এটা একটা ব্যবহার whileসঙ্গে -loop কমান্ড শুধুমাত্র লুপিং যখন অব্যাহত রাখার জন্য ব্যপ্তিতে আছে।[$i


পুরো বর্ণমালা মুদ্রণের পরিবর্তে আপনার স্ক্রিপ্টটি একটি পরিবর্তনশীল সংজ্ঞায়িত করে nএবং প্রথম $nছোট-ছোট অক্ষর মুদ্রণ করে । এখানে আপনার স্ক্রিপ্টের একটি সংস্করণ যা কোনও বাশ-নির্দিষ্ট বৈশিষ্ট্যগুলির উপর নির্ভর করে এবং ড্যাশে কাজ করে না, তবে এর জন্য প্রয়োজন seq:

#!/bin/sh

n=3 start=97
for i in $(seq $start $((start + n - 1))); do
    printf "\\$(printf %o $i)\n"
done

nআপনার স্ক্রিপ্টের মতো কতগুলি অক্ষর মুদ্রিত হয়েছে তার পরিবর্তনের মান সমন্বয় করে ।

এখানে এমন একটি সংস্করণ রয়েছে যাটির প্রয়োজন নেই seq:

#!/bin/sh

n=3 i=97 stop=$((i + n))
while [ $i -lt $stop ]; do
    printf "\\$(printf %o $i)\n"
    i=$((i + 1))
done

এখন পর্যন্ত, $stopএক উচ্চতর , তাই আমি ব্যবহার শেষ চিঠি চরিত্র কোড চেয়ে যে ছাপা হবে কর্তব্য -lt(কম) বদলে -le(কম বা সমান) সঙ্গে [কমান্ড। (এটি তৈরি stop=$((i + n - 1))ও ব্যবহারের জন্যও কাজ করবে [ $i -le $stop ])।


1
শিক্ষার চেয়ে এটি আপনার কাছে একটি বিস্ময়করভাবে বিস্তারিত উত্তর। আমি খুব শিক্ষানবিস, সুতরাং আমার স্ক্রিপ্টগুলি লেখার পদ্ধতিটি কাজ না করা পর্যন্ত ইন্টারনেটে পাওয়া কাজের উপাদানগুলিকে একত্রিত করছে। 1) আরও ভাল এবং 2) আমার কোনও সন্দেহ নেই যেগুলি আমি স্ক্রিপ্টগুলির সাহায্যে তৈরি করছি সেগুলি করার সহজ উপায় এবং উপরোক্ত বিষয়গুলি সাহায্য করার জন্য দীর্ঘ পথ অবধি চলে।
denski

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