সংক্ষিপ্ত উত্তর: ব্যবহার"$@" (ডাবল উদ্ধৃতি নোট) অন্যান্য ফর্ম খুব কমই দরকারী।
"$@"একটি বরং অদ্ভুত বাক্য গঠন। এটি পৃথক ক্ষেত্র হিসাবে সমস্ত অবস্থানগত পরামিতি দ্বারা প্রতিস্থাপিত হয়। যদি কোনও অবস্থানীয় প্যারামিটার না থাকে ( $#তবে 0 হয়) তবে "$@"কিছুতেই প্রসারিত হয় না (খালি স্ট্রিং নয়, তবে 0 টি উপাদান সহ একটি তালিকা), যদি একটি অবস্থানগত পরামিতি থাকে তবে "$@"সমান হয় "$1", যদি দুটি অবস্থানগত পরামিতি থাকে তবে "$@"তার সমান হয় "$1" "$2"ইত্যাদি
"$@"আপনাকে কোনও স্ক্রিপ্টের তর্ক বা অন্য কমান্ডে ফাংশন দেওয়ার অনুমতি দেয়। এটি র্যাপারগুলির জন্য খুব দরকারী যেগুলি পরিবেশের ভেরিয়েবলগুলি সেট করা, ডেটা ফাইল প্রস্তুত করা ইত্যাদির মতো জিনিসগুলি করে যা একইভাবে যুক্তি এবং বিকল্পগুলির সাহায্যে র্যাপারটি কল করা হয়েছিল calling
উদাহরণস্বরূপ, নিম্নলিখিত ফাংশন এর আউটপুট ফিল্টার করে cvs -nq update। আউটপুট ফিল্টারিং এবং রিটার্নের স্থিতি (যা তার grepচেয়ে বরং এটি হয় cvs) ব্যতীত cvssmকিছু যুক্তিযুক্ত কলগুলি cvs -nq updateএই যুক্তিগুলির সাথে কল করার মতো আচরণ করে ।
cvssm () { cvs -nq update "$@" | egrep -v '^[?A]'; }
"$@"অবস্থানগত পরামিতিগুলির তালিকায় প্রসারিত হয়। অ্যারেগুলিকে সমর্থন করে এমন শেলগুলিতে অ্যারের উপাদানগুলির তালিকায় প্রসারিত করার জন্য অনুরূপ বাক্য গঠন রয়েছে: "${array[@]}"(ধনুর্বন্ধনী zsh ব্যতীত বাধ্যতামূলক)। আবার, ডাবল উদ্ধৃতিগুলি কিছুটা বিভ্রান্তিকর: তারা ক্ষেত্র বিভাজন এবং অ্যারের উপাদানগুলির প্যাটার্ন জেনারেশন থেকে সুরক্ষা দেয় তবে প্রতিটি অ্যারে উপাদান তার নিজস্ব ক্ষেত্রে শেষ হয়।
কিছু প্রাচীন শেলের মধ্যে ত্রুটিযুক্ত ত্রুটি ছিল: যখন কোনও অবস্থানগত যুক্তি ছিল না, "$@"কোনও ক্ষেত্রের পরিবর্তে খালি স্ট্রিং সম্বলিত একক ক্ষেত্রে প্রসারিত হয়েছিল। এটি কার্যবিধির${1+"$@"} দিকে নিয়ে গেল ( পার্ল ডকুমেন্টেশনের মাধ্যমে বিখ্যাত হয়েছে )। কেবল আসল বোর্ন শেল এবং ওএসএফ 1 বাস্তবায়নের শুধুমাত্র পুরানো সংস্করণগুলি প্রভাবিত হয়েছে, এর আধুনিক সামঞ্জস্যপূর্ণ প্রতিস্থাপনগুলির (অ্যাশ, কেএসএইচ, বাশ,…) কোনওটিই নয়। /bin/shআমি জানি যে 21 তম শতাব্দীতে মুক্তি পেয়েছে এমন কোনও সিস্টেমে প্রভাবিত হবে না (যদি আপনি Tru64 রক্ষণাবেক্ষণের রিলিজ গণনা করেন না, এবং এমনকি /usr/xpg4/bin/shনিরাপদ থাকেন তবে কেবল #!/bin/shস্ক্রিপ্টই ক্ষতিগ্রস্থ হয় না, #!/usr/bin/env shযতক্ষণ না আপনার PATH প্যাসিক্স সম্মতিতে সেট করা থাকে ততক্ষণ স্ক্রিপ্টগুলি নয় ) । সংক্ষেপে, এটি একটি historicalতিহাসিক উপাখ্যান যা আপনাকে উদ্বিগ্ন হওয়ার দরকার নেই।
"$*"সর্বদা এক কথায় প্রসারিত হয়। এই শব্দটির মধ্যে অবস্থানগত পরামিতি রয়েছে, এর মাঝখানে একটি স্থান দিয়ে সংমিশ্রিত হয়। (আরও সাধারণভাবে, বিভাজকটি IFSভেরিয়েবলের মানের প্রথম অক্ষর হয় If যদি মানটি IFSখালি স্ট্রিং হয় তবে বিভাজকটি খালি স্ট্রিং)) যদি কোনও অবস্থানগত পরামিতি না থাকে তবে "$*"খালি স্ট্রিংটি থাকে, যদি দুটি থাকে অবস্থানগত পরামিতি এবং IFSএর ডিফল্ট মান হয় তার "$*"সমান "$1 $2", ইত্যাদি etc.
$@এবং $*বাইরের উদ্ধৃতি সমান। এগুলি পৃথক ক্ষেত্রের মতো অবস্থানগত পরামিতিগুলির তালিকায় প্রসারিত হয় "$@"; তবে প্রতিটি ফলাফল ক্ষেত্র পৃথক ক্ষেত্রগুলিতে বিভক্ত হয় যা ফাইলের নাম ওয়াইল্ডকার্ড নিদর্শন হিসাবে বিবেচিত হয়, যথাযথভাবে অযোগ্য ভেরিয়েবল বিস্তারের সাথে।
উদাহরণস্বরূপ, যদি বর্তমান ডিরেক্টরী তিন ফাইল রয়েছে bar, bazএবং foo, তারপর:
set -- # no positional parameters
for x in "$@"; do echo "$x"; done # prints nothing
for x in "$*"; do echo "$x"; done # prints 1 empty line
for x in $*; do echo "$x"; done # prints nothing
set -- "b* c*" "qux"
echo "$@" # prints `b* c* qux`
echo "$*" # prints `b* c* qux`
echo $* # prints `bar baz c* qux`
for x in "$@"; do echo "$x"; done # prints 2 lines: `b* c*` and `qux`
for x in "$*"; do echo "$x"; done # prints 1 lines: `b* c* qux`
for x in $*; do echo "$x"; done # prints 4 lines: `bar`, `baz`, `c*` and `qux`