ঠিক যেমনটি কাজ করতে আর্গুমেন্টগুলি পাস করুন


10

আমি নিম্নলিখিত ফাংশন আছে:

bar() { echo $1:$2; }

আমি এই ফাংশনটি অন্য একটি ফাংশন থেকে কল করছি foo,। fooনিজেই নিম্নলিখিত হিসাবে বলা হয়:

foo "This is" a test

আমি নিম্নলিখিত আউটপুট পেতে চাই:

This is:a

অর্থাত, যে আর্গুমেন্টগুলি barপ্রাপ্ত হয় সেগুলি একই টোকেন হওয়া উচিত যা আমি প্রবেশ করি foo

fooএটি অর্জনের জন্য কীভাবে বাস্তবায়ন করা দরকার? আমি নিম্নলিখিত দুটি বাস্তবায়ন চেষ্টা করেছি, কিন্তু কার্যকর হয় না:

  • foo() { bar $*; }

    - আউটপুট: this:is

  • foo() { bar "$*"; }

    - আউটপুট: this is a test:

আমার প্রশ্ন কার্যকরভাবে আমি কীভাবে যুক্তিগুলির উদ্ধৃতি সংরক্ষণ করতে পারি is এটা কি আদৌ সম্ভব?


উত্তর:


14

ব্যবহার "$@":

$ bar() { echo "$1:$2"; }
$ foo() { bar "$@"; }
$ foo "This is" a test
This is:a

"$@"এবং এর "$*"বিশেষ অর্থ রয়েছে:

  • "$@"শব্দের জন্য বিস্তৃতি না করিয়ে একাধিক শব্দে প্রসারিত হয় (যেমন "$1" "$2" ...)।
  • "$*" আইএফএসে প্রথম অক্ষরের সাথে অবস্থানগত পরামিতিগুলিতে যোগ দেয় (বা আইএফএস আনসেট না থাকলে স্থান বা আইএফএস ফাঁকা থাকলে কিছুই নয়)।

ধন্যবাদ, আমি জানতাম না যে $*এই অর্থপূর্ণ ছিল - এখন এটি যৌক্তিক। আমি মনে করি এই উত্তরটি অ্যারেগুলিতে পুনরাবৃত্তি করার সময় আমার যে সমস্যাটি হয়েছিল তা আসলেই সমাধান করে ...
কনরাড রুডলফ

6

$@পরিবর্তে আপনার অবশ্যই ব্যবহার করা উচিত$*

bar() { echo "$1:$2"; }

foo() { bar "$@"; }

foo "This is" a test

ouput

This is:a

কেন এটি কাজ করে?

যেহেতু $*, সমস্ত প্যারামিটারকে একটি শব্দ হিসাবে দেখা হয় , এর অর্থ This is a testআপনি barফাংশনে চলে যাবেন । এই ক্ষেত্রে, ফাংশন বারে 1 ম প্যারামিটার পাস This, 2 য় হয় is

এর সাথে $@প্রতিটি পরামিতি একটি উদ্ধৃত স্ট্রিং , এর অর্থ 'This is' 'a' 'test'আপনি barমজাদার হয়ে যাবেন । সুতরাং 1 ম প্যারামিটার পাস ফাংশন বার হয় This is, দ্বিতীয় হয় a

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