শেল কমান্ডটি ব্যাখ্যা করুন: শিফট $ (($ optind - 1))


30

আমি লিনাক্স লোক নই তবে আমার প্রকল্পের জন্য আমাকে পড়তে হবে এমন কিছু স্ক্রিপ্টে আটকেছি। সুতরাং এই আদেশটি কি করছে কেউ আমাকে সহায়তা করতে পারে?

shift $(($optind - 1))

3
নীচে উল্লিখিত হিসাবে, ওপটিআইএনডি অবশ্যই আপার ক্ষেত্রে থাকতে হবে এবং প্রথম বন্ধনের অভ্যন্তরে '$' isচ্ছিক।
ডার্কহার্ট

উত্তর:


49

shift $((OPTIND-1))(দ্রষ্টব্য OPTINDআপার ক্ষেত্রে) সাধারণত একটি getopts whileলুপ পরে অবিলম্বে পাওয়া যায় । $OPTINDদ্বারা প্রাপ্ত বিকল্পগুলির সংখ্যা getopts

যেমন পলজোহন 32 মন্তব্যে উল্লেখ করেছে, কঠোরভাবে বললে, পরবর্তী কমান্ড লাইন আর্গুমেন্টের OPTINDঅবস্থান দেয় ।

জিএনইউ বাশ রেফারেন্স ম্যানুয়াল থেকে :

গেমপটস অপটস্ট্রিং নাম [টি]

getoptsঅবস্থানগত পরামিতিগুলি পার্স করতে শেল স্ক্রিপ্টগুলি ব্যবহার করা হয়। optstringস্বীকৃতি পাওয়ার জন্য বিকল্প অক্ষর রয়েছে; যদি কোনও চরিত্রটি কোলন অনুসরণ করে, তবে বিকল্পটির একটি আর্গুমেন্ট থাকবে বলে আশা করা হচ্ছে, যা এটি সাদা স্থান দ্বারা পৃথক করা উচিত। কোলন (':') এবং প্রশ্ন চিহ্ন ('?') বিকল্প অক্ষর হিসাবে ব্যবহার করা যাবে না। প্রতিবার এটি প্রার্থনা করা হয়, getoptsশেল পরিবর্তনশীল নামে পরবর্তী বিকল্প স্থান, আরম্ভের nameযদি এটা বিদ্যমান নয়, এবং পরবর্তী যুক্তি সূচক পরিবর্তনশীল মধ্যে প্রক্রিয়া হওয়ার OPTINDOPTINDপ্রতিবার শেল বা শেল স্ক্রিপ্ট শুরু হওয়ার সাথে সাথে প্রথমে 1 টি করা হয়। যখন কোনও বিকল্পের জন্য একটি আর্গুমেন্টের প্রয়োজন হয়, গিওপ্টস যুক্তিটিকে ভেরিয়েবলের মধ্যে রাখে OPTARG। শেলটি রিসেট হয় নাOPTIND স্বয়ংক্রিয়ভাবে; getoptsযদি প্যারামিটারগুলির একটি নতুন সেট ব্যবহার করা হয় তবে এটি অবশ্যই একই শেল আহ্বানের মধ্যে একাধিক কলগুলির মধ্যে ম্যানুয়ালি পুনরায় সেট করতে হবে।

বিকল্পগুলির শেষের মুখোমুখি হলে, getoptsশূন্যের চেয়ে বড় রিটার্ন সহ প্রস্থান করে। OPTINDপ্রথম অ-বিকল্পের যুক্তির সূচীতে সেট করা আছে এবং নামটি '?' তে সেট করা আছে।

getoptsস্বাভাবিকভাবে অবস্থানগত পরামিতি parses, কিন্তু আর্গুমেন্ট দেওয়া হয় যদি args, getoptsঐ পরিবর্তে parses।

shift n অবস্থানগত পরামিতিগুলির তালিকা থেকে এন স্ট্রিংগুলি
সরিয়ে দেয় । এইভাবে প্যারামিটার তালিকা থেকে পার্স করা সমস্ত বিকল্প সরিয়ে দেয় এবং সুতরাং সেই বিন্দুর পরে, স্ক্রিপ্টে পাস হওয়া প্রথম অ-বিকল্প যুক্তিটি উল্লেখ করবে।shift $((OPTIND-1))getopts$1

হালনাগাদ

মাইক্রজার যেমন মন্তব্যে উল্লেখ করেছেন, shift $((OPTIND-1))অনিরাপদ হতে পারে। অযাচিত শব্দ বিভাজন ইত্যাদি প্রতিরোধ করতে সমস্ত প্যারামিটারের বিস্তৃতি ডাবল-কোট করা উচিত। কমান্ডের জন্য নিরাপদ ফর্ম হয়

shift "$((OPTIND-1))"


মনে হচ্ছে এটি কেবলমাত্র তখনই ঠিক কাজ করবে যদি বিকল্পগুলি বাকী অবস্থানগত তর্ক যুক্ত হওয়ার আগে ঘটে। সঠিক?
স্টিভ জর্জেনসেন

@ স্টিভ জর্জেনসেন: হ্যাঁ, এটা ঠিক। ওটিওএইচ, অ-বিকল্পের যুক্তিগুলির পরে বিকল্পগুলি স্থাপন করা sh / বাশ কনভেনশনের বিপক্ষে। সাধারণত, ড্যাশ দিয়ে শুরু না হওয়া প্রথম যুক্তিগুলি বিকল্পগুলির সমাপ্তি নির্দেশ করে এবং ড্যাশ দিয়ে শুরু হওয়া কোনও পরবর্তী আরগগুলি বিকল্প হিসাবে বিবেচিত হয় না। সমস্ত প্রোগ্রাম এই সম্মেলনে মেনে চলেন না, তবে আপনি যদি করেন তবে এটি জীবনকে অনেক সরল করে তোলে। :)
প্রধানমন্ত্রী 2 রিং

@ স্টিভ জর্জেনসেন: (চালিয়ে যাওয়া) এই বিষয়টিতে সংক্ষেপে আলোচনা করা হয়েছে কেন কিছু ইউটিলিটি বিকল্পগুলির আগে অপারেশনকে পার্স করে? । Celada এর উত্তর গিলেজ 'মন্তব্য উল্লেখ, কিছু প্রোগ্রাম (মত find) পারে চেহারা তারা অ অপশন পর অপশন অনুমতি, কিন্তু তারা না: তারা operands যে একটি ড্যাশ দিয়ে শুরু আছে।
পিএম 2 রিং

এই তথ্যটির জন্য ধন্যবাদ (এবং সম্পাদনা) @ ম্যাসভি এটি একটি দুর্দান্ত অস্বাভাবিক IFS, তবে দুঃখিতের চেয়ে নিরাপদ থাকা ভাল। ;)
টা রিং

@ রাইমা যদি IFS=0123456789, shift $((OPTIND-1))(উদ্ধৃতি ব্যতীত) রূপান্তরিত হয় shift ""যা নিঃশব্দে উপেক্ষা করা হবে (ইন ksh) বা ত্রুটি তৈরি করবে (এবং bashএবং dash)।
মশবী

8

$((...))শুধু স্টাফ গণনা। আপনার ক্ষেত্রে এটির মান নেয় $optintএবং 1 টি বাদ দেয়।

shiftঅবস্থানগত পরামিতি অপসারণ। আপনার ক্ষেত্রে এটি optint-1পরামিতিগুলি সরিয়ে দেয় ।

আরও তথ্যের জন্য কটাক্ষপাত আছে help getopts, help shiftএ বর্ণন man bash"পাটিগণিত সম্প্রসারণ" জন্য, বিশেষ করে এর জন্য Google getopts

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