শেল স্ক্রিপ্টটি চালানোর সময়, সমস্তগুলি যথাযথভাবে প্রবেশ না করে নির্দিষ্ট অবস্থানগত পরামিতিগুলি পাস করা কি সম্ভব?


13

উদাহরণস্বরূপ, যদি আমার কাছে স্ক্রিপ্ট থাকে ./foo যা 10 টি প্যারামিটার নেয় এবং আমি কেবলমাত্র 8 তম প্যারামিটারটি পাস করতে চাই। বর্তমানে এটি কীভাবে করা যায় তা আমি জানতে পারি:

./foo '' '' '' '' '' '' '' 'bar'

কোন সহজ / উন্নত উপায় আছে?


1
এই কারণেই যদি প্রোগ্রামগুলি প্রচুর পরিমাণে প্যারামিটার থাকে তবে সাধারণত অবস্থানগত পরামিতিগুলির চেয়ে বিকল্পগুলি ব্যবহার করে।
বার্মার

উত্তর:


4

এই জিনিসটি করার আরেকটি উপায় হ'ল আপনি যে প্যারামিটারটি ঘোষণা করতে চান তার নামকরণ এবং তারপরে এটি করা:

{   cat >./foo 
    chmod +x ./foo
    eight=declared ./foo
    eight=declared_and_preferred \
        ./foo 1 2 3 4 5 6 7 8
    ./foo 1 2 3 4 5 6 7 8
    ./foo
} <<\SCRIPT
#!/usr/bin/sh
: ${eight:=${8:-some_default}}
printf '$eight = %s\n' "$eight"
#END
SCRIPT

আউটপুট

$eight = declared
$eight = declared_and_preferred
$eight = 8
$eight = some_default

উপরের উদাহরণে স্পষ্টভাবে ঘোষিত পরিবেশ পরিবর্তনশীলটি কমান্ড-লাইন আর্গুমেন্টের পক্ষে অগ্রাধিকার দেওয়া হয়, তবে পরিবেশ ভেরিয়েবলটি ফাঁকা বা আনসেট না হলে কমান্ড-লাইন যুক্তি ব্যবহৃত হয় used যখন 8 তম অবস্থানগত এবং পরিবেশের ভেরিয়েবল $eightউভয়ই খালি থাকে বা ডিফল্ট মানটি সেট না করে কিছু_ডেফাল্ট নির্ধারিত হয় $eight। উভয় ক্ষেত্রেই খালি গ্রহণযোগ্য মান হওয়া উচিত বা বিবৃতি :থেকে সরানো যেতে পারে ।:-:=

পরিবর্তনশীল $eightপাশাপাশি সেট করা যেতে পারে:

printf '$eight = %s\n' "${eight:=${8:-some_default}}"

... এবং পূর্ববর্তী লাইনটি পুরোপুরি বাদ দেওয়া হয়েছিল তবে আমি প্রদর্শন করতে চেয়েছিলাম যে এভাবে চলক ঘোষণার ফলে স্থির মান হয় এবং তাই আমি এটি দুটি কমান্ডে করেছিলাম। যে কোনও উপায়ে $eightসেই যৌগিক প্যারামিটার বিস্তারের চূড়ান্ত মান সেট করা আছে।

getopts- শক্তিশালী স্ক্রিপ্টগুলির জন্য - প্রায়শই হ'ল কমান্ড বিকল্পগুলি হ্যান্ডেল করার সর্বোত্তম উপায় । অন্যদিকে অবস্থানগত প্যারামিটারগুলি প্রায়শই সর্বদা একটি স্ক্রিপ্টে দৃust ়তার সাথে পরিচালনা করার সবচেয়ে সহজ উপায় ।

উদাহরণ স্বরূপ:

touch file$(seq -ws\ file 100)
./foo *

আউটপুট

$eight = file008

সেখানে আমরা কেবল অষ্টম অপারেন্ড দেখতে পাচ্ছি, তবে আমার পরীক্ষা ডিরেক্টরি থেকে তাদের 101 টি গ্লোববেড রয়েছে।


18

আপনি স্ক্রিপ্টটি পরিবর্তন করতে পারবেন তা ধরে নিয়ে, আপনার প্রয়োজনীয় প্যারামিটারগুলির (আর্গুমেন্ট) পরিবর্তে paraচ্ছিক পরামিতি (বিকল্পগুলি) ব্যবহার করা উচিত।

আপনার যদি বিকল্প হিসাবে প্রথম 7 টি সাতটি পরামিতি থাকে এবং খালি স্ট্রিংয়ে সেগুলি ডিফল্ট করে থাকে তবে আপনি কেবল এটি করতে পারেন:

./foo bar

আপনি যদি পসিক্স-সামঞ্জস্যপূর্ণ শেল ব্যবহার করেন তবে আপনি getoptsইউটিলিটি বা প্রোগ্রামটি ব্যবহার করতে পারেন getoptbash- বেশিরভাগ শাঁসের মতো - getoptsবিল্ট-ইন হিসাবে অফার দেয় । আপনার নিজস্ব কমান্ড-লাইন পার্সার রোল করার চেয়ে যে কোনও উপায়ে সহজ।

আপনি যদি সর্বশেষ এক্স অ-বিকল্প আর্গুমেন্টের মতো কোনও কিছু কার্যকর না করেন তবে আপনি যদি কোনও সেটিং সেট করতে চান তবে আপনার 7 টি (এখন খালি) স্ট্রিংয়ের আগে বিকল্প স্ট্রিংগুলি সরবরাহ করতে হবে XY বিকল্প যুক্তিগুলির জন্য মানগুলি। এটি তবে সাধারণ অনুশীলন নয়, সাধারণত একটি বিকল্প সর্বদা একটি বিকল্প এবং একটি যুক্তি একটি আর্গুমেন্ট এবং "সন্নিবেশ" বিকল্পের ক্রমটি বিনামূল্যে।


5
+1জন্য getopt(s)। অবস্থানগত পরামিতিগুলি একটি দুঃখের সময়, এবং এড়ানো উচিত।
HalosGhost
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.