বাশ কমান্ড লাইন আরগস অ্যাক্সেস করা হচ্ছে vs @ বনাম $ *


327

অনেক এসও প্রশ্ন এবং বাশ টিউটোরিয়ালে আমি দেখতে পাই যে আমি দুটি উপায়ে ব্যাশ স্ক্রিপ্টগুলিতে কমান্ড লাইন আরগগুলি অ্যাক্সেস করতে পারি:

$ ~ >cat testargs.sh 
#!/bin/bash

echo "you passed me" $*
echo "you passed me" $@

যার ফলাফল:

$ ~> bash testargs.sh arg1 arg2
you passed me arg1 arg2
you passed me arg1 arg2

মধ্যে পার্থক্য কি $*এবং $@?
একজনকে কখন ব্যবহার করা উচিত এবং কখন ব্যবহার করা উচিত?


এই উত্তরটি কটাক্ষপাত করা: stackoverflow.com/a/842325/671366
codeling

ইন্টেলিজজে স্ট্যাটিক বিশ্লেষণ echo "something $@"ত্রুটি হিসাবে বিবেচনা করে
অ্যালেক্স কোহন

উত্তর:


436

বিশেষ পরামিতিগুলি উদ্ধৃত করা হলে পার্থক্যটি উপস্থিত হয়। আমি পার্থক্যগুলি বর্ণনা করি:

$ set -- "arg  1" "arg  2" "arg  3"

$ for word in $*; do echo "$word"; done
arg
1
arg
2
arg
3

$ for word in $@; do echo "$word"; done
arg
1
arg
2
arg
3

$ for word in "$*"; do echo "$word"; done
arg  1 arg  2 arg  3

$ for word in "$@"; do echo "$word"; done
arg  1
arg  2
arg  3

উদ্ধৃত করার গুরুত্বের উপর আরও একটি উদাহরণ: নোট করুন "আরগ" এবং সংখ্যার মধ্যে 2 স্পেস রয়েছে, তবে আমি যদি $ শব্দটি উদ্ধৃত করতে ব্যর্থ হই:

$ for word in "$@"; do echo $word; done
arg 1
arg 2
arg 3

এবং ব্যাশে, "$@"পুনরাবৃত্তি করার জন্য "ডিফল্ট" তালিকাটি রয়েছে:

$ for word; do echo "$word"; done
arg  1
arg  2
arg  3

65
+1 আমি সবসময়ই ভেবেছিলাম যে এই ধারণাটি একটি সাধারণ উদাহরণ দ্বারা সর্বোত্তমভাবে প্রদর্শিত হয়েছিল, যাতে ব্যাশের ম্যানুয়ালটিতে সম্পূর্ণ অভাব রয়েছে।
চিপনার

5
কোনও সম্ভাব্য ব্যবহারের কেস আছে, যখন প্রয়োজন হতে পারে $*বা "$*"প্রয়োজন হতে পারে, এবং উদ্দেশ্যটি দ্বারা সরবরাহ করা যায় না $@বা "$@"?
আনিসনে

5
কোনও "র‌্যাপার" স্ক্রিপ্টের জন্য কোন সংস্করণ বেশি উপযুক্ত, যেখানে স্ক্রিপ্টগুলির পরামিতিগুলি একটি নতুন কমান্ডের প্যারামিটার হওয়ার দরকার?
সেগফল্ট

7
@ সেগফল্ট, এক্ষেত্রে সর্বদা "$@"উদ্ধৃতি দিয়ে বেছে নিন ।
গ্লেন জ্যাকম্যান

2
এই উত্তরে দরকারী উদাহরণ রয়েছে তবে এটি যদি তাদের পিছনের প্রক্রিয়াটিও ব্যাখ্যা করে in কেন এটি এভাবে কাজ করে?
লিই

255

বাশ হ্যাকার্স উইকির একটি দুর্দান্ত উপকারী ওভারভিউ টেবিল :

$ * বনাম $ @ টেবিল

যেখানে cতৃতীয় সারির $IFSঅভ্যন্তরীণ ক্ষেত্র বিভাজক, শেল ভেরিয়েবলের প্রথম অক্ষর ।

যদি আর্গুমেন্টগুলি কোনও স্ক্রিপ্ট ভেরিয়েবলে সংরক্ষণ করতে হয় এবং আর্গুমেন্টে স্পেস থাকে বলে আশা করা হয়, আমি আন্তরিকভাবে "$*"অভ্যন্তরীণ ক্ষেত্র বিভাজকটিকে $IFSট্যাবে সেট করে একটি কৌশল নিয়োগের পরামর্শ দিচ্ছি ।


42
... যেখানে "সি" হ'ল
FS আইএফএসের

39
... এবং $IFS"অভ্যন্তরীণ ক্ষেত্র বিভাজক" for
সার্জ স্ট্রোব্যান্ড ডেস্ক

এখানে একটি উদাহরণ দেওয়া আছে , যার মধ্যে উদ্ধৃত ইনপুট অন্তর্ভুক্ত রয়েছে। ইনপুটটিও গুরুত্বপূর্ণ!
সার্জ Stroobandt

ধরা যাক আমি একটি মোড়ক স্ক্রিপ্ট তৈরি করতে চাই যা মোড়ানো কমান্ডের কার্যকারিতা নকল করা ছাড়া কিছুই করে না। মোড়ক স্ক্রিপ্ট থেকে অভ্যন্তরীণ কমান্ডে অর্গগুলি পাস করার জন্য আমার কোন বাক্য গঠন ব্যবহার করা উচিত?
মেরিনোস

44

$ *

এক থেকে শুরু করে অবস্থানগত পরামিতিগুলিতে প্রসারিত হয়। ডাবল উদ্ধৃতিগুলির মধ্যে যখন প্রসারণ ঘটে তখন এটি আইএফএস বিশেষ ভেরিয়েবলের প্রথম অক্ষর দ্বারা পৃথক পৃথক প্রতিটি প্যারামিটারের মান সহ একক শব্দে প্রসারিত হয়। অর্থাৎ, "$ *" "$ 1c $ 2c ..." এর সমান, যেখানে সি আইএফএস ভেরিয়েবলের মানটির প্রথম অক্ষর। যদি আইএফএস সেট না করা থাকে তবে পরামিতিগুলি স্পেস দ্বারা পৃথক করা হয়। যদি আইএফএস নাল হয় তবে পরামিতিগুলি বিভক্তকারীদের বিরতি ছাড়াই যুক্ত হয়।

$ @

এক থেকে শুরু করে অবস্থানগত পরামিতিগুলিতে প্রসারিত হয়। ডাবল উদ্ধৃতিতে যখন প্রসারণ ঘটে তখন প্রতিটি প্যারামিটার পৃথক শব্দের দিকে প্রসারিত হয়। অর্থাৎ, "$ @" "$ 1" "$ 2" এর সমতুল্য ... যদি কোনও শব্দের মধ্যে দ্বিগুণ-উদ্ধৃত বিস্তৃতি ঘটে, তবে প্রথম প্যারামিটারের প্রসারটি মূল শব্দের প্রারম্ভিক অংশের সাথে যুক্ত হবে এবং প্রসারিত হবে শেষ প্যারামিটারের সাথে মূল শব্দের শেষ অংশটি যুক্ত হয়েছিল। যখন কোনও অবস্থানীয় পরামিতি নেই, "$ @" এবং $ @ কিছুই প্রসারিত করবেন না (যেমন, সেগুলি সরানো হয়েছে)।

সূত্র: বাশ মানুষ


15

$ @ $ * এর সমান, তবে প্রতিটি পরামিতি একটি উদ্ধৃত স্ট্রিং, অর্থাত্ প্যারামিটারগুলি ব্যাখ্যা বা সম্প্রসারণ ছাড়াই অক্ষত অবস্থায় পাস করা হয়। এর অর্থ, অন্যান্য বিষয়গুলির মধ্যেও, যুক্তি তালিকার প্রতিটি পরামিতি পৃথক শব্দ হিসাবে দেখা যায়।

অবশ্যই, "$ @" উদ্ধৃত করা উচিত।

http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST


1

এই উদাহরণটি আমরা ব্যবহার করার সময় "at" এবং "asterix" এর মধ্যে পার্থক্যটি হাইলাইট করতে পারি। আমি দুটি অ্যারে "ফল" এবং "শাকসবজি" ঘোষণা করেছি

fruits=(apple pear plumm peach melon)            
vegetables=(carrot tomato cucumber potatoe onion)

printf "Fruits:\t%s\n" "${fruits[*]}"            
printf "Fruits:\t%s\n" "${fruits[@]}"            
echo + --------------------------------------------- +      
printf "Vegetables:\t%s\n" "${vegetables[*]}"    
printf "Vegetables:\t%s\n" "${vegetables[@]}"    

উপরের কোডটি নীচের ফলাফলটি দেখুন:

Fruits: apple pear plumm peach melon
Fruits: apple
Fruits: pear
Fruits: plumm
Fruits: peach
Fruits: melon
+ --------------------------------------------- +
Vegetables: carrot tomato cucumber potatoe onion
Vegetables: carrot
Vegetables: tomato
Vegetables: cucumber
Vegetables: potatoe
Vegetables: onion

6
বৈজ্ঞানিকভাবে বলতে গেলে টমেটো ফল।
র্যান্ডি

1
তুমি সঠিক! "উদ্ভিদবিদ্যায়, একটি ফুল ফুলের পরে ডিম্বাশয় থেকে গঠিত ফুলের গাছগুলিতে (এঞ্জিওস্পার্ম হিসাবেও পরিচিত) বীজ বহনকারী কাঠামো" " en.wikipedia.org/wiki/Fruit
স্টিফ্যানসন

@ র্যান্ডি: বৈজ্ঞানিকভাবে বলতে গেলে, সব ফলই সবজি (এটি "উদ্ভিদ" এর প্রতিশব্দ)।
ক্রিস লুয়েংগো

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