স্বর্ণকেশ 'মন্তব্য এবং মানবতা রেফারেন্স বর্ণনা হিসাবে,
shiftঅবস্থানগত মাপদণ্ডগুলি (reassigns $1, $2ইত্যাদি), যাতে $1পুরোনো মান লাগে $2,
$2এর মান লাগে $3ইত্যাদি *
পুরোনো মান $1বাতিল করা হয়। ( $0পরিবর্তিত হয় না)) এটি করার কয়েকটি কারণের মধ্যে রয়েছে:
- এটি আপনাকে দশম যুক্তি (যদি একটি থাকে তবে) আরও সহজে অ্যাক্সেস করতে দেয়।
$10কাজ করে না - এটিকে সংক্ষিপ্ত হিসাবে ব্যাখ্যা করা $1হয় 0
(এবং এরকম কিছু তৈরি হতে পারে Hello0)। একটি পরে shift, দশম যুক্তি হয়ে যায় $9। (তবে, বেশিরভাগ আধুনিক শেলগুলিতে আপনি ব্যবহার করতে পারেন ${10}))
- বাশ গাইডের জন্য যেমন প্রারম্ভিকরা দেখায়, এটি আর্গুমেন্টের মাধ্যমে লুপ করতে ব্যবহৃত হতে পারে। আইএমএনএসএইচও, এটি আনাড়ি;
forতার জন্য অনেক ভাল।
- আপনার উদাহরণের স্ক্রিপ্টের মতো, কিছু যুক্তি বাদে সমস্ত আর্গুমেন্টকে একইভাবে প্রক্রিয়া করা সহজ করে তোলে। উদাহরণস্বরূপ, আপনার স্ক্রিপ্টে
$1এবং $2পাঠ্যের স্ট্রিংগুলি রয়েছে $3এবং অন্যান্য সমস্ত পরামিতিগুলি ফাইলের নাম।
সুতরাং এটি এখানে কীভাবে খেলবে তা এখানে। মনে করুন আপনার স্ক্রিপ্টটি বলা হয় Patryk_scriptএবং এটি হিসাবে ডাকা হয়
Patryk_script USSR Russia Treaty1 Atlas2 Pravda3
স্ক্রিপ্ট দেখে
$1 = USSR
$2 = Russia
$3 = Treaty1
$4 = Atlas2
$5 = Pravda3
স্টেটমেন্টটি ostr="$1"ভেরিয়েবল সেট ostrকরে USSR। প্রথম shiftবিবৃতিটি নিম্নরূপে অবস্থানগত পরামিতিগুলিকে পরিবর্তন করে:
$1 = Russia
$2 = Treaty1
$3 = Atlas2
$4 = Pravda3
স্টেটমেন্টটি nstr="$1"ভেরিয়েবল সেট nstrকরে Russia। দ্বিতীয় shiftবিবৃতিটি অবস্থানগত পরামিতিগুলিকে নিম্নরূপ পরিবর্তন করে:
$1 = Treaty1
$2 = Atlas2
$3 = Pravda3
এবং তারপর forলুপ পরিবর্তন USSR( $ostr) এর Russia( $nstr) ফাইলের মধ্যে Treaty1, Atlas2এবং Pravda3।
স্ক্রিপ্ট নিয়ে কয়েকটি সমস্যা রয়েছে।
ফাইলের জন্য $ @; করা
যদি স্ক্রিপ্টটি হিসাবে ডাকা হয়
প্যাট্রিক_স্ক্রিপ্ট ইউএসএসআর রাশিয়া চুক্তি 1 "ওয়ার্ল্ড অ্যাটলাস 2" প্রভদা 3
এটা দেখে
$ 1 = ইউএসএসআর
$ 2 = রাশিয়া
$ 3 = সন্ধি 1
$ 4 = ওয়ার্ল্ড অ্যাটলাস 2
$ 5 = প্রভদা 3
কিন্তু, কারণ $@উদ্ধৃত করা হয় না, আপনার স্থান World Atlas2উদ্ধৃত নয়, এবং forলুপ মনে চার ফাইল আছে: Treaty1, World, Atlas2, এবং Pravda3। এটি হয় হওয়া উচিত
"$ @" এ ফাইলের জন্য; করা
(আর্গুমেন্টে কোনও বিশেষ চরিত্রের উদ্ধৃতি দিতে) বা সহজভাবে
ফাইল করার জন্য
(যা দীর্ঘ সংস্করণের সমতুল্য)।
eval "sed 's /" ostr "/" $ nstr "/ g' $ ফাইল"
এটি হওয়ার দরকার নেই eval, এবং চেক না করা ব্যবহারকারী ইনপুট একটিতে evalবিপদজনক হতে পারে। উদাহরণস্বরূপ, যদি স্ক্রিপ্টটি হিসাবে ডাকা হয়
প্যাট্রিক_স্ক্রিপ্ট "'; আরএম *;'" রাশিয়া চুক্তি 1 অ্যাটলাস 2 প্রভদা 3
এটি কার্যকর করা হবে rm *! যদি এটি ব্যবহারকারীর চেয়ে উচ্চতর সুবিধাসহ স্ক্রিপ্টটি চালানো যায় তবে এটি বড় উদ্বেগের বিষয়; উদাহরণস্বরূপ, যদি এটি sudoওয়েব ইন্টারফেসের মাধ্যমে চালানো বা আহ্বান করা যায়। এটি সম্ভবত এত গুরুত্বপূর্ণ নয় যদি আপনি কেবল নিজের ডিরেক্টরিতে এটি নিজের ডিরেক্টরিতে ব্যবহার করেন। তবে এতে পরিবর্তন করা যায়
সেড "s / $ অস্টার / $ nstr / জি" "$ ফাইল"
এটি এখনও কিছু ঝুঁকি আছে, কিন্তু তারা খুব কম গুরুতর।
if [ -f $file ], > $file.tmpএবং যথাক্রমে mv $file.tmp $file
হওয়া উচিত if [ -f "$file" ], > "$file.tmp"এবং mv "$file.tmp" "$file"ফাইলের নামগুলি হ্যান্ডেল করার জন্য যেগুলিতে স্পেস (বা অন্যান্য মজার অক্ষর) থাকতে পারে। ( eval "sed …কমান্ডটি ফাইলের নামগুলিও ফাঁক করে দেয় যার মধ্যে স্পেস রয়েছে))
* shift একটি alচ্ছিক যুক্তি নেয়: একটি ধনাত্মক পূর্ণসংখ্যা যা কতগুলি পরামিতি স্থানান্তরিত করতে হবে তা নির্দিষ্ট করে। ডিফল্ট হ'ল একটি ( 1)। উদাহরণস্বরূপ, shift 4কারণ $5
পরিণত $1,
$6পরিণত $2, ইত্যাদি। (দ্রষ্টব্যদের জন্য বাশ গাইডের উদাহরণটি ভুল হিসাবে লক্ষ্য করুন Note ) এবং তাই আপনার স্ক্রিপ্টটি বলতে পরিবর্তন করা যেতে পারে
ostr="$1"
nstr="$2"
shift 2
যা আরও স্পষ্ট বলে বিবেচিত হতে পারে।
শেষ নোট / সতর্কতা:
উইন্ডোজ কমান্ড প্রম্পট (ব্যাচ ফাইল) ভাষাও একটি SHIFTকমান্ড সমর্থন করে, যা মূলত shiftইউনিক্স শেলের কমান্ডের মতো একই কাজ করে, যার মধ্যে একটি উল্লেখযোগ্য পার্থক্য রয়েছে, যা আমি লোককে বিভ্রান্ত হওয়ার হাত থেকে রক্ষা করার চেষ্টা করার জন্য আড়াল করব:
- একটি আদেশ
SHIFT 4যেমন একটি ত্রুটি, "SHIFT কমান্ডে অবৈধ পরামিতি" ত্রুটি বার্তা দেয়।
SHIFT /n, যেখানে n0 থেকে 8 এর মধ্যে পূর্ণসংখ্যা হয়, এটি বৈধ - তবে এটি সময় বদলে যায় না । এটা তোলে একবার শিফ্ট, দিয়ে শুরু এন ম যুক্তি। তাই কারণ (পঞ্চম যুক্তি) পরিণত পরিণত , ইত্যাদি, একা 3 মাধ্যমে আর্গুমেন্ট 0 রেখে।n SHIFT /4%5%4,
%6%5
pushdএবংpopd)।