আপনার স্ক্রিপ্টে বাশ শেলের তিনটি বৈশিষ্ট্য ব্যবহার করা হয়েছে যা সমস্ত বোর্ন-স্টাইলের শেলগুলি সরবরাহ করে না। হিমাইল যেমন বলে , আপনি সহজেই bashপরিবর্তে সেই স্ক্রিপ্টটি চালাতে পারেন sh। তোমার hashbang শীর্ষ (লাইনে #!/bin/bash) নির্দিষ্ট করে bashকিন্তু শুধুমাত্র কার্যকর যদি তুমি চালানো , স্ক্রিপ্ট হিসাবে heemayl ব্যাখ্যা । আপনাকে স্ক্রিপ্টের নাম পাস যদি sh, shস্বয়ংক্রিয়ভাবে কল করা হবে না bash, কিন্তু কেবল স্ক্রিপ্ট চালানো হবে। এটি কারণ আপনার স্ক্রিপ্টটি আসলে চলার পরে হ্যাশবাং লাইনের কোনও প্রভাব নেই ।
আপনার অন্যান্য বিকল্প, যদি আপনাকে ব্যাশ বৈশিষ্ট্যগুলির উপর নির্ভর করে না এমন পুরোপুরি পোর্টেবল স্ক্রিপ্টগুলি লেখার প্রয়োজন হয় তবে আপনার স্ক্রিপ্টটি পরিবর্তন করা যাতে এটি ছাড়া এটি কাজ করে। আপনার ব্যবহৃত বাশ বৈশিষ্ট্যগুলি হ'ল:
- একটি অ্যারে । এটি প্রথমে এসেছিল, সুতরাং যখন আপনি ড্যাশ শেল দিয়ে আপনার স্ক্রিপ্টটি চালানোর চেষ্টা করলেন তখন ত্রুটিটি এলো । প্রথম বন্ধনীযুক্ত এক্সপ্রেশন
( {a..z} ), যা আপনি বরাদ্দ করেছেন chars, একটি অ্যারে তৈরি করে ${chars[i]}এবং এটি আপনার লুপে উপস্থিত হয়, এতে সূচি হয়।
- বন্ধনী সম্প্রসারণ। বাশ এবং অন্যান্য অনেক শেলের মধ্যেও
{a..z}প্রসারিত হয় a b c d e f g h i j k l m n o p q r s t u v w x y z। তবে এটি বোর্ন-স্টাইলের শেলগুলির কোনও সর্বজনীন (বা মানক) বৈশিষ্ট্য নয় এবং ড্যাশ এটি সমর্থন করে না।
- সি-স্টাইলের বিকল্প-
forলুপ সিনট্যাক্স । যদিও উপর ভিত্তি করে গাণিতিক সম্প্রসারণ , যা ব্যাশ নির্দিষ্ট নিজেই না (যদিও কিছু খুব পুরানো, অ-POSIX-অনুবর্তী শাঁস এটি না, হয়), সি-শৈলী forলুপ হয় একটি ব্যাশ-আইএসএস এবং ব্যাপকভাবে করতে পোর্টেবল নয় অন্যান্য শাঁস
বিশেষত উবুন্টুর মতো জিএনইউ / লিনাক্স সিস্টেমগুলিতে ব্যাশ ব্যাপকভাবে উপলব্ধ এবং ম্যাকোস এবং অন্যান্য অনেক সিস্টেমেও উপলব্ধ। আপনি বাশ-সুনির্দিষ্ট বৈশিষ্ট্যগুলি কতটা ব্যবহার করছেন তা বিবেচনা করে আপনি আপনার স্ক্রিপ্টগুলি চালানোর সময় কেবল বাশ (বা এমন কোনও শেল যা আপনি ব্যবহার করছেন এমন বৈশিষ্ট্যগুলি সমর্থন করে) ব্যবহার করছেন make
তবে আপনি যদি চান তবে পোর্টেবল কনস্ট্রাক্টের সাহায্যে এগুলি প্রতিস্থাপন করতে পারেন। অ্যারে এবং সি স্টাইলের forলুপটি প্রতিস্থাপন করা সহজ; ধনুর্বন্ধনী প্রসার ছাড়াই অক্ষরের পরিসর তৈরি করা (এবং আপনার স্ক্রিপ্টে এগুলি হার্ড-কোডিং ছাড়াই) হ'ল এক অংশ যা সামান্য জটিল।
প্রথমে, এখানে এমন একটি স্ক্রিপ্ট রয়েছে যা সমস্ত নিম্ন-বর্ণিত লাতিন অক্ষর মুদ্রণ করে:
#!/bin/sh
for i in $(seq 97 122); do
printf "\\$(printf %o $i)\n"
done
seqকমান্ড সাংখ্যিক ক্রম তৈরি করে। কমান্ড প্রতিস্থাপন$( ) সঞ্চালন করে , তাই আউটপুট সঙ্গে প্রতিস্থাপন করা হয় । এগুলি হল চরিত্র কোড জন্য মাধ্যমে ।$(seq 97 122)seq 97 122az
- শক্তিশালী
printfকমান্ড অক্ষর কোডগুলিকে অক্ষরে পরিণত করতে পারে (উদাহরণস্বরূপ, printf '\141'প্রিন্টগুলি a, একটি নতুন লাইন অনুসরণ করে ) তবে কোডগুলি অবশ্যই অষ্টালে থাকতে হবে , তবে seqকেবলমাত্র দশমিকের আউটপুট । সুতরাং আমি printfদু'বার ব্যবহার করেছি : অভ্যন্তর printf %o $iদশমিক সংখ্যা (সরবরাহিত seq)কে অক্টালে রূপান্তর করে এবং বাহ্যিক কমান্ডে প্রতিস্থাপিত হয় printf। (যদিও এটি হেক্সাডেসিমাল ব্যবহার করাও সম্ভব , এটি কোনও সহজ এবং কম পোর্টেবল বলে মনে হয় না ))
printf\সেই কোডের সাথে অক্ষর \nহিসাবে এবং একটি নিউলাইন হিসাবে একটি অষ্টাল সংখ্যা অনুসরণ করে ব্যাখ্যা করে । তবে শেলটি\ একটি পালানোর চরিত্র হিসাবেও ব্যবহার করে । একটি \সামনে $প্রতিরোধ করবে $থেকে ঘটতে সম্প্রসারণ ঘটাচ্ছে (এই ক্ষেত্রে, ইন কমান্ড প্রতিকল্পন ), কিন্তু আমি যে প্রতিরোধ করতে না চান, তাই আমি এটা অন্য সঙ্গে পালিয়ে গেছে \; যে জন্য কারণ \\। দ্বিতীয়টির \আগে nপালানোর দরকার নেই কারণ বিপরীতে \$, \nদ্বিগুণ-উদ্ধৃত স্ট্রিংয়ের শেলের বিশেষ অর্থ নেই।
- শেল প্রোগ্রামিংয়ে কীভাবে ডাবল কোটস এবং ব্যাকস্ল্যাশ ব্যবহৃত হয় সে সম্পর্কে আরও তথ্যের জন্য , আন্তর্জাতিক মানের উদ্ধৃতিতে বিভাগটি দেখুন । আরও দেখুন 3.1.2 বরাত দিয়ে এ ব্যাশ রেফারেন্স ম্যানুয়াল , বিশেষ করে 3.1.2.1 এস্কেপ অক্ষর এবং 3.1.2.3 উদ্ধৃতি চিহ্ন । (এখানে প্রসঙ্গে পুরো বিভাগটি দেওয়া আছে )) নোট করুন যে একক উদ্ধৃতি (
') এছাড়াও শেল উদ্ধৃতি বাক্য গঠনের একটি গুরুত্বপূর্ণ অঙ্গ, আমি কেবল সেগুলি স্ক্রিপ্টটিতে ব্যবহার করেছি না।
এটি বেশিরভাগ ইউনিক্স-মতো সিস্টেমে পোর্টেবল এবং আপনি কোন বোর্ন-স্টাইল শেল ব্যবহার করেন তা নির্ভর করে না। তবে কয়েকটি ইউনিক্স-মতো সিস্টেমে 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 ])।