শেল স্ক্রিপ্টে mean @ এর অর্থ কী?


উত্তর:


240

$@হয় সব পরামিতি স্ক্রিপ্টে গৃহীত।

উদাহরণস্বরূপ, আপনি যদি কল করেন ./someScript.sh foo barতবে $@সমান হবে foo bar

যদি তুমি করো:

./someScript.sh foo bar

এবং তারপরে ভিতরে someScript.shউল্লেখ:

umbrella_corp_options "$@"

এটি umbrella_corp_optionsপ্রতিটি পৃথক প্যারামিটারের সাথে ডাবল উদ্ধৃতিতে আবদ্ধ হবে, কলারের কাছ থেকে ফাঁকা স্থানের সাথে প্যারামিটার নেবে এবং সেগুলি পাস করবে।


1
আমি যদি করি তবে What @ কী থাকবে someScript.sh foo bar "boo far"?
trusktr

1
शिक्षण. idallen.com/dat2330/04f/notes/shell_variables.txt এটি পরীক্ষা করে দেখুন।
হার

7
ডাবল উক্তিগুলিতে লেখা থাকলে es @ বিশেষ। তারপরে এটি উদ্ধৃত মানগুলির একটি তালিকার ফলস্বরূপ, আপনার ক্ষেত্রে trusktr, তিনটি আর্গুমেন্ট "foo", "বার", এবং "boo far" এর মধ্যে in
আলফে

4
যদিও এটি সাধারণত ক্ষেত্রে দেখা যায়, $@নেই অগত্যা স্ক্রিপ্ট ... যেমন প্রেরণ paramaters থেকে আসা; set a b "x   y"; printf '(%s)' "$@"ফলাফল(a)(b)(x   y)
পিটার.ও

ভাল আমি Alfe এর উত্তর মত কারণ তিনি মধ্যে মূল পার্থক্য দেয় $@এবং$*
donleyp

106

$@$*উভয়ের অর্থ "সমস্ত কমান্ড লাইন আর্গুমেন্ট" প্রায় একই রকম is এগুলি প্রায়শই সমস্ত আর্গুমেন্টকে অন্য কোনও প্রোগ্রামে পাস করার জন্য ব্যবহৃত হয় (এইভাবে অন্য প্রোগ্রামটির চারপাশে একটি মোড়ক তৈরি করে)।

দুটি সিনট্যাক্সের মধ্যে পার্থক্যটি প্রদর্শিত হয় যখন আপনার ফাঁকা জায়গাগুলির সাথে কোনও যুক্তি রয়েছে (উদাহরণস্বরূপ) এবং $@ডাবল উদ্ধৃতিতে রেখেছেন :

wrappedProgram "$@"
# ^^^ this is correct and will hand over all arguments in the way
#     we received them, i. e. as several arguments, each of them
#     containing all the spaces and other uglinesses they have.
wrappedProgram "$*"
# ^^^ this will hand over exactly one argument, containing all
#     original arguments, separated by single spaces.
wrappedProgram $*
# ^^^ this will join all arguments by single spaces as well and
#     will then split the string as the shell does on the command
#     line, thus it will split an argument containing spaces into
#     several arguments.

উদাহরণ: কল করা

wrapper "one two    three" four five "six seven"

ফলাফল হবে:

"$@": wrappedProgram "one two    three" four five "six seven"
"$*": wrappedProgram "one two    three four five six seven"
                             ^^^^ These spaces are part of the first
                                  argument and are not changed.
$*:   wrappedProgram one two three four five six seven

2
এগুলি এক নয় এবং ম্যানপেজটি I * আইএফএস using ব্যবহারের পার্শ্ব প্রতিক্রিয়াগুলিতে স্পষ্ট যা অগত্যা স্থান নয়। (যদি তারা একই রকম হয় তবে উভয়কেই উপস্থাপনে সামঞ্জস্যতা ছাড়া অন্য কোনও কথা থাকতে পারে না।)
জর্জেনসেন

6
না তারা না. এবং আমি নীচে দুটি লাইন বলেছি: "দু'জনের মধ্যে পার্থক্য ..." ছোট বাক্য পেতে এবং পাঠযোগ্যতা বাড়াতে পাঠককে রায় দেওয়ার আগে একাধিক বাক্য পড়তে হয়: - /
Alfe

2
আলফ, ক্রিস্টোফারের সেই শব্দটি "প্রায়" সন্নিবেশ করানো কোনও তাত্পর্য বা পাঠযোগ্যতা ছাড়াই তাত্পর্যপূর্ণ করেছিল। আসলে আমি পার্থক্যটির সূক্ষ্ম জোরের কারণে এই উত্তরটিকে (স্বীকৃত জবাবের বিপরীতে) উঁচু করে তুলেছি ... - বুঝতে পেরেছিলাম যে এটি প্রায় আপনার ইচ্ছার বিরুদ্ধে ছিল! ;)
এসজেড

আমি মনে করি যে এই শব্দটি প্রথম বাক্যটি পড়ার পরে রায় দেয় এমন লোকের পক্ষে একটি পার্থক্যের সৃষ্টি করেছিল ;-) এবং এটি কখনও আমার ইচ্ছার বিরুদ্ধে ছিল না। আমি সত্যিই এই লোকদের জন্য লিখতে চাই।
আলফে

খুব অস্পষ্ট। wrappedProgram "$*"-> separated by single spaces.তবে আপনার দ্বিতীয় উদাহরণে সেগুলি একক স্পেস দ্বারা পৃথক করা হয়নি।
ফেলিক্স ডমবাক

36

এটি হ'ল কমান্ড লাইন আর্গুমেন্ট যেখানে:

$@= স্ট্রিংয়ের তালিকায়
$*সমস্ত যুক্তি সংরক্ষণ করে = সমস্ত আর্গুমেন্টকে একক স্ট্রিং হিসাবে সংরক্ষণ করে
$#= আর্গুমেন্টের সংখ্যা সঞ্চয় করে


(@Iruvar দ্বারা উল্লিখিত উপরোক্ত ভুলত্রুটিটি ঠিক করা হয়েছিল।)
মতিন উলহাক

13

খাঁটি $@অর্থের ব্যবহার বেশিরভাগ ক্ষেত্রে "প্রোগ্রামারকে যতটা সম্ভব কষ্ট দেয়", কারণ বেশিরভাগ ক্ষেত্রে এটি শব্দের পৃথকীকরণ এবং ফাঁকা স্থান এবং যুক্তিগুলিতে অন্যান্য অক্ষরগুলির সাথে সমস্যা সৃষ্টি করে।

(অনুমান করা) সকল ক্ষেত্রে 99% এর মধ্যে এটি আবদ্ধ করা দরকার ": "$@"আর্গুমেন্টগুলির উপর নির্ভরযোগ্যতার সাথে পুনরাবৃত্তি করার জন্য এটি ব্যবহার করা যেতে পারে।

for a in "$@"; do something_with "$a"; done

4
আপনার লাইনটি লিখিত হতে পারে: এ জন্য; "$ এ" দিয়ে কিছু করুন; সম্পন্ন ;-)
আলফ

1
@ আমি জানি; আমি কেবল এটি ভুলে গেছি। এটিকে ভাবুন for a in start_token "$@" end_token; do something_with "$a"; done:-)
glglgl

9

ম্যানুয়াল থেকে:

@

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


1

অর্থ।

সংক্ষেপে, $@কলার থেকে ফাংশন বা স্ক্রিপ্টে স্থানিক স্থিতিগত আর্গুমেন্টগুলিতে প্রসারিত হয় । এর অর্থ প্রাসঙ্গিক-নির্ভর : একটি ফাংশনের অভ্যন্তরে, এটি এই জাতীয় ফাংশনে প্রেরিত আর্গুমেন্টগুলিতে প্রসারিত হয়। যদি কোনও স্ক্রিপ্টে ব্যবহৃত হয় (কোনও স্কোপের ভিতরে নয়) তবে এটি এ জাতীয় স্ক্রিপ্টে আর্গুমেন্টে প্রসারিত হয়।

$ cat my-sh
#! /bin/sh
echo "$@"

$ ./my-sh "Hi!"
Hi!
$ put () ( echo "$@" )
$ put "Hi!"
Hi!

শব্দ বিভাজন।

$@শেলটিতে কীভাবে আচরণ করা হয় তা বোঝার সময় এখন আর একটি বিষয় যা সর্বাধিক গুরুত্বের সাথে তা শব্দ বিভাজন । শেলটি IFSভেরিয়েবলের সামগ্রীর উপর ভিত্তি করে টোকেনগুলি বিভক্ত করে । এর ডিফল্ট মান \t\n; যেমন, সাদা স্থান, ট্যাব এবং নিউলাইন।

প্রসারিত করা "$@"আপনাকে পাস করা আর্গুমেন্টগুলির একটি প্রাথমিক কপি দেয় । তবে প্রসারণ $@সবসময় হয় না not আরও সুনির্দিষ্টভাবে, যদি যুক্তিগুলির মধ্যে অক্ষর থাকে তবে IFSসেগুলি বিভক্ত হবে।


আপনি বেশিরভাগ সময় যা ব্যবহার করতে চাইবেন তা "$@"নয় $@

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