শেল স্ক্রিপ্টে $ {} এবং $ () এর মধ্যে পার্থক্য


28
$ echo $(date)
Thu Jul 2 16:33:11 SGT 2015
$ echo ${date}

$ name=foo
$ echo $(name)
ksh: name:  not found

$ echo ${name}
foo

$ {ভেরিয়েবল like এর মতো দেখতে $ ভেরিয়েবলের মতো। যখন $ () হ'ল একটি কমান্ড কার্যকর করা হয়। তাহলে $ {{কেন ব্যবহার করবেন?


উত্তর:


39

$(command)হ'ল "কমান্ড সাবস্টিটিউশন"। আপনি যেমন বুঝতে পেরেছেন, এটি চালায় command, তার আউটপুটটি ক্যাপচার করে এবং কমান্ড লাইনে যেটি অন্তর্ভুক্ত করে তা সন্নিবেশ করায় $(…); যেমন,

$ ls -ld $(date +%B).txt
-rwxr-xr-x  1 Noob Noob    867 Jul  2 11:09 July.txt

${parameter}"প্যারামিটার বিকল্প"। " প্যারামিটার সম্প্রসারণ " শিরোনামে শেলের ম্যান পৃষ্ঠা, বাশ (1) তে প্রচুর তথ্য পাওয়া যাবে :

${parameter}
    প্যারামিটারের মান প্রতিস্থাপিত হয়। যখন প্যারামিটারটি একাধিক অঙ্কের অবস্থানগত প্যারামিটার হয় তবে যখন প্যারামিটারটি এমন কোনও অক্ষর দ্বারা অনুসরণ করা হয় যা এর নামের অংশ হিসাবে ব্যাখ্যা করা যায় না The

অবস্থানগত পরামিতিগুলির জন্য , নীচে " অবস্থানগত পরামিতি " দেখুন। অন্যান্য উত্তরগুলিতে যেমন দেখা যায় তেমনি এর সর্বাধিক সাধারণ ব্যবহারে parameterএকটি পরিবর্তনশীল নাম। ${…}ফর্ম, উপরের হিসাবে অনুচ্ছেদের শেষে বিবৃত, আপনি একটি ভেরিয়েবলের মান (অর্থাত, পেতে দেয় ) এবং তা অবিলম্বে অনুসরণ একটি চিঠি, অঙ্ক, অথবা আন্ডারস্কোর সঙ্গে$variable_name

$ প্রাণী = বিড়াল
$ প্রতিধ্বনি $ প্রাণী
                                # "প্রাণী" এর মতো কোনও ভেরিয়েবল নেই ।
$ প্রতিধ্বনি {{প্রাণী} গুলি
বিড়াল
$ প্রতিধ্বনি $ প্রাণী_ফুড
                                # "অ্যানিম্যাল_ফুড" এর মতো কোনও ভেরিয়েবল নেই ।
$ প্রতিধ্বনি {{প্রাণী} _ফুড
বিড়াল খাদ্য

আপনি উদ্ধৃতি দিয়ে এটি করতে পারেন:

$ প্রতিধ্বনি "$ প্রাণী" গুলি
বিড়াল

অথবা, বিকল্পগুলির অনুশীলন হিসাবে, আপনি দ্বিতীয় পরিবর্তনশীল ব্যবহার করতে পারেন:

ural বহুবচন = গুলি
$ প্রতিধ্বনি $ প্রাণী $ বহুবচন
বিড়াল

তবে এটি মাত্র 1 ধাপ the ম্যান পৃষ্ঠার পরবর্তী অনুচ্ছেদটি আকর্ষণীয়, যদিও কিছুটা রহস্যজনক:

যদি প্যারামিটারের প্রথম অক্ষরটি একটি বিস্মৃত বিন্দু ( !) হয় তবে ভ্যারিয়েবল ইন্ডিরেশনের একটি স্তর চালু করা হয়। বাশ অন্যান্য প্যারামিটার থেকে গঠিত ভেরিয়েবলের মানটি ভেরিয়েবলের নাম হিসাবে ব্যবহার করে; এই পরিবর্তনশীলটি তখন প্রসারিত হয় এবং সেই মানটি প্যারামিটারের মানের পরিবর্তে বাকী বিকল্পে ব্যবহৃত হয়। এটি পরোক্ষ সম্প্রসারণ হিসাবে পরিচিত ।     (ব্যতিক্রম)    উদ্দীপনা পয়েন্টটি অবিলম্বে নির্দেশের প্রবর্তনের জন্য বামবন্ধনীটি অনুসরণ করতে হবে।

আমি উদাহরণস্বরূপ বাদে কীভাবে এই পরিষ্কার করতে পারি তা নিশ্চিত নই:

$ প্রাণী = বিড়াল
$ প্রতিধ্বনি $ প্রাণী
বিড়াল
$ বিড়াল = ট্যাবি
$ প্রতিধ্বনি $ বিড়াল
বাদামী রঙের বিড়াল
$ প্রতিধ্বনি animal animal! প্রাণী}
বাদামী রঙের                            # যদি $ পশু হয় "বিড়াল" , তারপর $ {! পশু} হয় $ বিড়াল , অর্থাত্, "বাদামী রঙের"

সুতরাং আসুন এই পদক্ষেপ 1½ কল করুন। পদক্ষেপ 2 হিসাবে আপনি করতে পারেন এমন অনেক আকর্ষণীয় জিনিস রয়েছে:

$ প্রাণী = বিড়াল
$ প্রতিধ্বনি $ {# প্রাণী}
3                                # স্ট্রিং দৈর্ঘ্য
$ প্রতিধ্বনি $ {প্রাণী / এ / ওউ}
গরু                              # প্রতিস্থাপন

{}ধনুর্বন্ধনী ব্যতীত আপনি সেগুলির কোনও কিছুই করতে পারবেন না ।

অবস্থানগত পরামিতি

এই কৃত্রিম উদাহরণ বিবেচনা করুন :

$ বিড়াল myecho.sh
প্রতিধ্বনি $ 1 $ 2 $ 3 $ 4 $ 5 $ 6 $ 7 $ 8 $ 9 $ 10 $ 11 $ 12 $ 13 $ 14 $ 15
/ ./myecho.sh আরে ডডল করল, বিড়াল এবং বেড়াল, গরু চাঁদের উপরে লাফিয়ে উঠল।
হেই ডিডল ডিডল, বিড়াল এবং বেড়াল, দ্য হে 0 হে 1 হেই 2 হে 3 হে 4 হে 5

কারণ শেল বোঝে না $10, $11, ইত্যাদিতে একইরূপে $10যেমন যদি এটা ছিল ${1}0। তবে এটি বোঝে না ${10}, ${11}ইত্যাদি, ম্যান পৃষ্ঠায় উল্লিখিত ("একাধিক অঙ্কের একটি অবস্থানগত প্যারামিটার")।

তবে আসলে স্ক্রিপ্টগুলি এর মতো লিখবেন না; দীর্ঘ যুক্তি তালিকার সাথে মোকাবিলা করার আরও ভাল উপায় রয়েছে।

শেলটির ম্যান পৃষ্ঠাতে বাশ (1) এর উপরের (আরও অনেকগুলি কন্সট্রাক্টরের পাশাপাশি ) আরও বেশি দৈর্ঘ্যে আলোচনা করা হয়েছে ।${parameter…something_else}

উক্তি উপর একটি নোট

নোট করুন যে আপনার কাছে সর্বদা শেল ভেরিয়েবলগুলি উদ্ধৃত করা উচিত যদি না আপনার কাছে না করার কোনও ভাল কারণ না থাকে এবং আপনি নিশ্চিত যে আপনি কী করছেন তা আপনি নিশ্চিত । বিপরীতে, ধনুর্বন্ধনীগুলি গুরুত্বপূর্ণ হতে পারে, সেগুলি উদ্ধৃতিগুলির মতো গুরুত্বপূর্ণ নয়।

$ ফাইলের নাম = "নার্সারি ছড়া। txt"
s ls -ld $ {ফাইলের নাম}
ls: নার্সারি অ্যাক্সেস করতে পারে না: এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই
ls: rhyme.txt অ্যাক্সেস করতে পারে না: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই
$ ls -ld "$ ফাইলের নাম"
-rwxr-xr-x 1 Noob Noob 5309 জুলাই 2 11:09 নার্সারি ছড়া.txt

এটি অবস্থানগত পরামিতিগুলিতেও প্রয়োগ হয় (যেমন, কমান্ড-লাইন আর্গুমেন্ট; যেমন, "$1") এবং কমান্ড প্রতিস্থাপন:

$ ls -ld $ (তারিখ "+% B% Y") xt
ls: জুলাই অ্যাক্সেস করতে পারবেন না: এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই
ls: 2015.txt অ্যাক্সেস করতে পারে না: এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই
$ ls -ld "$ (তারিখ" +% B% Y ")। txt"
-rwxr-xr-x 1 নুব নুব 687 জুলাই 2 11:09 জুলাই 2015.txt

কোটস এবং … এর মধ্যে মিথস্ক্রিয়া সম্পর্কিত একটি সংক্ষিপ্ত গ্রন্থের জন্য কমান্ড প্রতিস্থাপনে বাশ উদ্ধৃতিগুলি অবিচ্ছিন্নভাবে দেখুন ।$()


দুর্দান্ত উদাহরণের জন্য ধন্যবাদ আপনি কি ব্যবহারের বিস্তারিত বর্ণনা করতে পারেন! আপনার উদাহরণে আমি জানি না কীভাবে এটি কাজ করে।
নুব

@ নুব: ঠিক আছে, আমি এর ব্যবহারটি বিশদভাবে জানিয়েছি !
জি-ম্যান

ধন্যবাদ। কোনওরকম! প্রাণীটি আসলে মূল্য বিড়ালের পরিবর্তে পরিবর্তনশীল বিড়ালের কথা উল্লেখ করছে। আপনি কী আমাকে কীভাবে বলতে পারেন / কীভাবে প্রতিধ্বনিতে "গ" হয়ে যায় {{প্রাণী / এট / ow b বাশের লোকটির ব্যাখ্যাটি কোনওভাবে ... আমি জানি না। বুঝতে কঠিন.
নুব

এছাড়াও, আপনি কি এই বাক্যাংশটি বিশদভাবে বলতে পারেন - "$ {প্যারামিটার para প্যারামিটারের মান প্রতিস্থাপিত হয়।" কিসের বদলে? যদি প্যারামিটার ফল হয় এবং এর মান আপেল - ফল = আপেল, তাই $ {ফল} - আপেল এর পরিবর্তে প্রতিস্থাপিত হয় ?? সত্যিকার অর্থে এখানে প্রতিস্থাপন করবেন না
নুব

@ নুব: " ${!animal}আসলে $catমান বিড়ালের পরিবর্তে পরিবর্তনশীলকে উল্লেখ করছে ।" হ্যাঁ, ঠিক এটিই মূল বিষয় the "প্রতিধ্বনি {{প্রাণী / এট / ow in এ / সি কীভাবে" গ "হয়ে যায়?" হু? / এ "গ" হয়ে যায় না; "ক্যাট" "ওউ" দিয়ে প্রতিস্থাপন করা হলে "বিড়াল" "গরু" হয়ে ওঠে।
জি-ম্যান বলছেন 'মনিকাকে পুনরায় ইনস্টল করুন'

7

আপনার উদাহরণে, $ var এবং $ {var ident অভিন্ন। তবে, আপনি যখন স্ট্রিংয়ে ভেরিয়েবলটি প্রসারিত করতে চান তখন কোঁকড়া ধনুর্বন্ধনী কার্যকর হয়:

    $ string=foo
    $ echo ${string}bar
      foobar
    $ echo $stringbar

    $ 

সুতরাং কোঁকড়া ধনুর্বন্ধনী বক্ররেখার পরিবর্তে নতুন ভেরিয়েবলের নাম পেতে ভেরিয়েবলটি প্রতিস্থাপনের একটি মাধ্যম সরবরাহ করে।


4

আমি সাধারণত স্ট্রিং এ এটি আরও সাধারণভাবে দেখতে পাই। এর মতো কিছু কাজ করবে না:

var="a"
echo "$varRAW_STRING"

তবে এটি করবে:

var="a"
echo "${var}RAW_STRING"

যেমনটি আপনি সঠিকভাবে বলেছেন, $()একটি আদেশ কার্যকর করতে ব্যবহৃত হয়:

dir_contents=$(ls)

আপনি ব্যাকটিকগুলিও ব্যবহার করতে পারেন তবে আমি $()আরও বহুমুখী find একটি জিনিসের জন্য, ব্যাকটিকগুলি (সহজেই) নেস্ট করা যায় না।

date_directory=`ls `date '+%Y-%m-%d'`` # Makes no sense
date_directory=$(ls $(date '+%Y-%m-%d')) # Much better

আসলে, ব্যাকটিক করতে নেস্টেড হতে: date_directory=`ls \`date '+%Y-%m-%d'\``। তবে এটি মারাত্মক কুৎসিত; $(…)এটি আরও পরিষ্কার এবং ব্যবহার করা সহজ।
জি-ম্যান বলছেন 'পুনরায় ইনস্টল করুন মনিকা'

যথেষ্ট ঠিক পরিষ্কার. এটা তোলে টেকনিক্যালি সম্ভব, কিন্তু আমি কেউ কি কখনো শুধু পাঠযোগ্যতা কারণ এরকম কল্পনা করতে পারবেন না
bytesized

1
ওয়েল, `…`ছিল বছরের পর বছর ধরে (শুধুমাত্র) কমান্ড প্রতিকল্পন জন্য সিনট্যাক্স আগে , আবিষ্কৃত হয়, যাতে আপনি কিছু কল্পনা করা প্রয়োজন হবে না - মানুষ এটা করেনি। $(…)
জি-ম্যান বলছেন 'পুনরায় ইনস্টল করুন মনিকা'

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