শেল ভেরিয়েবলের চারপাশে কখন আমাদের কোঁকড়া ধনুর্বন্ধনী প্রয়োজন?


657

শেল স্ক্রিপ্টগুলিতে, {}চলকগুলি প্রসারিত করার সময় আমরা কখন ব্যবহার করব ?

উদাহরণস্বরূপ, আমি নিম্নলিখিতগুলি দেখেছি:

var=10        # Declare variable

echo "${var}" # One use of the variable
echo "$var"   # Another use of the variable

একটি উল্লেখযোগ্য পার্থক্য আছে, বা এটি কেবল স্টাইল? একজনের কি অন্যের চেয়ে বেশি পছন্দ হয়?

উত্তর:


749

এই বিশেষ উদাহরণে, এটি কোনও পার্থক্য করে না। যাইহোক, {}${}যদি আপনি পরিবর্তনশীল প্রসারিত করতে চান উপযোগী fooস্ট্রিং

"${foo}bar"

যেহেতু "$foobar"পরিবর্তে দ্বারা চিহ্নিত ভেরিয়েবল প্রসারিত হবে foobar

কোঁকড়া ধনুর্বন্ধনী এছাড়াও নিঃশর্ত প্রয়োজন যখন:

  • হিসাবে অ্যারে উপাদানগুলি প্রসারণ করা হচ্ছে ${array[42]}
  • প্যারামিটার এক্সপেনশন অপারেশনগুলি ব্যবহার করে, ${filename%.*}(এক্সটেনশন সরান)
  • 9 এর বাইরে অবস্থানের পরামিতিগুলি প্রসারণ করা: "$8 $9 ${10} ${11}"

কেবল সম্ভাব্য অস্পষ্ট ক্ষেত্রে এর পরিবর্তে সর্বত্র এটি করা ভাল প্রোগ্রামিং অনুশীলন হিসাবে বিবেচনা করা যেতে পারে। এটি ধারাবাহিকতার জন্য এবং এরকম চমক এড়াতে উভয়ই $foo_$bar.jpg, যেখানে আন্ডারস্কোরটি চলক নামের অংশ হয়ে যায় তা দৃশ্যত স্পষ্ট নয়।


106
{}বন্ধনী সম্প্রসারণ হিসাবে পরিচিত । ${}পরিবর্তনশীল সম্প্রসারণ হিসাবে পরিচিত। তারা বিভিন্ন কাজ করে। আমি কোনও প্রসারণ বিট বাদে আপনাকে উত্সাহিত করব।
স্পেন্সার রথবুন

5
@NewUser " সুতরাং অ্যারে এটা সত্যিই প্রয়োজন হয় না ছাড়া অন্য না, ধনুর্বন্ধনী জন্য প্রয়োজনীয়" প্যারামিটার সম্প্রসারণ , স্ক্রিপ্টিং একটি খুব দরকারী কনস্ট্রাক্ট। আমি অনেক সেড এবং অ্যাজিক স্ক্রিপ্ট দেখেছি যা কিছুটা পরামিতি বিস্তারের সাথে প্রতিস্থাপন করা যেতে পারে।
সিজেএক্স

10
@caffinatedmonkey $()একটি কমান্ড কার্যকর করতে ব্যবহার করা হয়, যেমন ভেরিয়েবলের md5sum=$(md5sum foo.bin)আউটপুট সংরক্ষণ করে এখন ব্যবহারযোগ্য । এছাড়াও, +1 এবং আরও অনেক কিছু ওপিকে স্পষ্ট করে বলা ভাল যে এটি অনুশীলন করার জন্য! md5sum foo.binmd5sum${md5sum}
L0j1k

11
@ L0j1k খোলামেলা সাক্ষীর কথা বললে, আমি এটি উল্লেখ করা গুরুত্বপূর্ণ মনে করি যে এটি $()একটি সাবসেল থেকে তার আদেশটি কার্যকর করে ।
অ্যাড্রিয়ান গন্টার

2
@ ক্যারেটেডোগ ${1:-20}প্যারামিটার সম্প্রসারণের একটি রূপ। এখানে এটি সুস্পষ্ট নয় কারণ এটি মূলত অঙ্কগুলি এবং গণিত অপারেটরগুলি ব্যবহার করে যা আমাদের গাণিতিক জড়িত রয়েছে তা ভেবে চিন্তিত করে, তবে এটি প্রকৃতপক্ষে অবস্থানগত প্যারামিটারকে বোঝায় $1, যা যদি সংজ্ঞায়িত না হয় তবে এটি একটি ডিফল্ট মান দ্বারা প্রতিস্থাপিত হবে 20(বাক্য গঠনটি হবে ${variable:-default_value})।
অ্যারন

126

চলকগুলি ঘোষিত হয় এবং নির্বিঘ্নে $এবং বাইরে নির্ধারিত হয় {}। আপনি ব্যবহার করতে হবে

var=10

দায়িত্ব অর্পণ করা. ভেরিয়েবল থেকে পড়তে (অন্য কথায়, ভেরিয়েবলটি 'প্রসারিত') করতে হবে, আপনাকে অবশ্যই ব্যবহার করতে হবে $

$var      # use the variable
${var}    # same as above
${var}bar # expand var, and append "bar" too
$varbar   # same as ${varbar}, i.e expand a variable called varbar, if it exists.

এটি আমাকে মাঝে মাঝে বিভ্রান্ত করে তুলেছে - অন্য ভাষায় আমরা ভেরিয়েবলটিকে একইভাবে উল্লেখ করি, নির্ধারিত কোনও অ্যাসাইনমেন্টের বামে বা ডানদিকে। তবে শেল-স্ক্রিপ্টিং আলাদা, $var=10আপনি যা ভাবেন সম্ভবত তা করেন না!


34

আপনি {}গ্রুপিং জন্য ব্যবহার । ধনুর্বন্ধনী অ্যারে উপাদানগুলি dereferences প্রয়োজন। উদাহরণ:

dir=(*)           # store the contents of the directory into an array
echo "${dir[0]}"  # get the first entry.
echo "$dir[0]"    # incorrect

আমি প্রথম লাইন বুঝতে পারি না dir=(*)। আমি যতদূর জানি, dirডিরেক্টরি বিষয়বস্তু (সমতুল্য ls -C -b) তালিকাভুক্ত করার জন্য একটি অন্তর্নির্মিত কমান্ড । আপনি দয়া করে ব্যাখ্যা করতে পারেন?
জার্ভিস

1
শেল প্রোগ্রামিংয়ে কমান্ড এবং আর্গুমেন্টগুলি অবশ্যই হোয়াইটস্পেসের মাধ্যমে একে অপরের থেকে পৃথক করা উচিত। এখানে, আপনি কোনও সাদা জায়গার সমতুল্য চিহ্নটি দেখতে পাচ্ছেন, অর্থাত এটি একটি পরিবর্তনশীল অ্যাসাইনমেন্ট। dirভেরিয়েবলের নাম এবং বন্ধনীগুলি *অ্যারেতে ফাইলের নাম প্রসার সংগ্রহ করতে ব্যবহৃত হয় ।
গ্লেন জ্যাকম্যান

27

আপনি ধনুর্বন্ধনী ভিতরে কিছু পাঠ্য ম্যানিপুলেশন করতে সক্ষম:

STRING="./folder/subfolder/file.txt"
echo ${STRING} ${STRING%/*/*}

ফলাফল:

./folder/subfolder/file.txt ./folder

অথবা

STRING="This is a string"
echo ${STRING// /_}

ফলাফল:

This_is_a_string

আপনার ঠিক "নিয়মিত ভেরিয়েবল" এ দরকার নেই ... তবে এটি ডিবাগিং এবং স্ক্রিপ্ট পড়ার জন্য আরও সহায়ক।


11

চলক নামের শেষে সাধারণত কোনও স্থান বা নিউলাইন দ্বারা স্বাক্ষরিত হয়। তবে আমরা যদি ভেরিয়েবল মান মুদ্রণের পরে কোনও স্থান বা নিউলাইন না চাই? কোঁকড়া ধনুর্বন্ধনী শেল ইন্টারপ্রেটারকে ভেরিয়েবলের নামের কোথায় থাকে তা বলে।

ক্লাসিক উদাহরণ 1) - শ্বেত স্পেস অনুসরণ না করে শেল পরিবর্তনশীল

TIME=10

# WRONG: no such variable called 'TIMEsecs'
echo "Time taken = $TIMEsecs"

# What we want is $TIME followed by "secs" with no whitespace between the two.
echo "Time taken = ${TIME}secs"

উদাহরণ 2) সংস্করণযুক্ত জার সহ জাভা শ্রেণিপথ

# WRONG - no such variable LATESTVERSION_src
CLASSPATH=hibernate-$LATESTVERSION_src.zip:hibernate_$LATEST_VERSION.jar

# RIGHT
CLASSPATH=hibernate-${LATESTVERSION}_src.zip:hibernate_$LATEST_VERSION.jar

(ফ্রেডের উত্তর ইতিমধ্যে এটি জানিয়েছে তবে তার উদাহরণটি কিছুটা বিমূর্ত)


5

অ্যারে উপাদানগুলিতে অ্যাক্সেস করতে এবং ব্রেস প্রসারণ চালিয়ে যাওয়ার জন্য সর্বদা কোঁকড়া ধনুর্বন্ধনী প্রয়োজন।

{}অস্পষ্টতার সুযোগ না থাকলেও অতিরিক্ত সতর্ক না হওয়া এবং শেল পরিবর্তনশীল প্রসারণের জন্য ব্যবহার করা ভাল ।

উদাহরণ স্বরূপ:

dir=log
prog=foo
path=/var/${dir}/${prog}      # excessive use of {}, not needed since / can't be a part of a shell variable name
logfile=${path}/${prog}.log   # same as above, . can't be a part of a shell variable name
path_copy=${path}             # {} is totally unnecessary
archive=${logfile}_arch       # {} is needed since _ can be a part of shell variable name

সুতরাং, তিনটি লাইনটি লিখলে ভাল:

path=/var/$dir/$prog
logfile=$path/$prog.log
path_copy=$path

যা অবশ্যই বেশি পঠনযোগ্য।

যেহেতু একটি চলক নাম একটি অঙ্ক দিয়ে শুরু করতে পারে না, তাই শেলটির {}সংখ্যাযুক্ত ভেরিয়েবলগুলির (যেমন $1, $2ইত্যাদি) প্রয়োজন হয় না যতক্ষণ না এই ধরণের সম্প্রসারিত অঙ্কটি অনুসরণ করা হয়। এটি খুব সূক্ষ্ম এবং এটি {}এ জাতীয় প্রসঙ্গে সুস্পষ্টভাবে ব্যবহার করতে পারে :

set app      # set $1 to app
fruit=$1le   # sets fruit to apple, but confusing
fruit=${1}le # sets fruit to apple, makes the intention clear

দেখা:


1
It's good to be not over-cautious: বেশিরভাগ লোকেরা কী ভাবছেন তা অবাক করি। সারাক্ষণ কোঁকড়া ধনুর্বন্ধনী ব্যবহার করুন যাতে আপনি যখন প্রয়োজন হয় তখন সেগুলি ভুলে যান না বা পাঠযোগ্যতার উন্নতি করতে কেবল যেখানে প্রয়োজন সেখানে সেগুলি ব্যবহার করুন।
রজার ডাহল

1
আমি মনে করি এটি সচেতনতার অভাব যা প্রোগ্রামারদের যখন প্রয়োজন হয় না তখনও কুরিগুলি ব্যবহার করে বাড়ে। অজ্ঞতাবশত শব্দ বিভাজন বা গ্লোববিং রোধ করতে ডাবল উদ্ধৃতি ব্যবহার না করা অন্যান্য সাধারণ ভুলের সাথে এই অজ্ঞতা সমান। এর গোড়ায়, বাস্তবতাটি হ'ল প্রোগ্রামাররা শাই স্ক্রিপ্টিং সম্পর্কে তেমন গুরুতর নন যে পাইথন এবং রুবির মতো অন্যান্য স্ক্রিপ্টিং ভাষার মতো।
কোডফোরস্টার

1
সত্য যে. আমার পোষা প্রাণীটি হ'ল প্রত্যেকের মনে হয় যে সমস্ত ভেরিয়েবলগুলি শেল স্ক্রিপ্টগুলিতে সমস্ত ক্যাপ হওয়া উচিত :)
রজার ডাহল

2

টেক্সট ম্যানিপুলেশন সম্পর্কে সিয়েরাক্স এবং পিটারের পরামর্শ অনুসরণ করে কোঁকড়া বন্ধনী {}একটি কমান্ডের সাথে একটি ভেরিয়েবল পাস করতে ব্যবহৃত হয়, উদাহরণস্বরূপ:

আসুন ধরা যাক আপনার কাছে একটি প্রসিদ্ধ ইতালিয়ান উপন্যাসের প্রথম লাইনযুক্ত একটি sposi.txt ফাইল রয়েছে:

> sposi="somewhere/myfolder/sposi.txt"
> cat $sposi

Ouput: quel ramo del lago di como che volge a mezzogiorno

এখন দুটি ভেরিয়েবল তৈরি করুন:

# Search the 2nd word found in the file that "sposi" variable points to
> word=$(cat $sposi | cut -d " " -f 2)

# This variable will replace the word
> new_word="filone"

এখন প্রতিস্থাপন শব্দ এক সঙ্গে পরিবর্তনশীল বিষয়বস্তু new_word , sposi.txt ফাইল ভিতরে

> sed -i "s/${word}/${new_word}/g" $sposi
> cat $sposi

Ouput: quel filone del lago di como che volge a mezzogiorno

"রামো" শব্দটি প্রতিস্থাপন করা হয়েছে।


1
এটি ভেরিয়েবলের চারপাশে কোঁকড়ানো ধনুর্বন্ধনী ছাড়া ঠিক পাশাপাশি কাজ করে।
আরমালি

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