কেন [[]] পরীক্ষায় ডাবল কোট ব্যবহার করবেন?


23

ধরা যাক আমাদের একটি ব্যাশ স্ক্রিপ্টে 2 টি পূর্ণসংখ্যা রয়েছে:

value1=5
value2=3

তাহলে কেন পরীক্ষা নেওয়ার ক্ষেত্রে আমাদের ডাবল কোট ব্যবহার করা দরকার? উদাহরণ স্বরূপ:

if [[ "$value1" -eq "$value2" ]]

শুধু নিচেরটি ব্যবহার করবেন না কেন?

if [[ $value1 -eq $value2 ]]

আমার কাছে, ডাবল উদ্ধৃতিগুলির কোনও অর্থ নেই।


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

13
যদিও টেরডন উল্লেখ করেছেন, এই নির্দিষ্ট নির্মাণে এটি খুব বেশি উদ্ধৃতি ভেরিয়েবলের প্রয়োজন হবে না (এবং অবশ্যই, কোথাও এক-শব্দের-মান সহ), আমি আপনাকে সর্বদা আপনার বারগুলি উদ্ধৃত করার পরামর্শটি দিতে চাই আপনি কি সত্যই জানেন যে আপনি ভেরিয়েবলগুলি অব্যক্ত রেখে যেতে পারেন? একেবারে উদ্ধৃত করার কারণটি এটির সাথে প্রয়োজনীয় না হলেও 5এবং 3রক্ষণাবেক্ষণযোগ্যতা। মানগুলি পরে পরিবর্তন হতে পারে এবং ফলস্বরূপ ত্রুটিগুলি সুস্পষ্ট নাও হতে পারে।
পিটার - মনিকা পুনরায় ইনস্টল করুন

2
@ সুদোডস আমি মনে করি না যে এটি সত্য [[ ]], কেবল তার জন্য [ ]
বেনিয়ামিন ডাব্লু।

1
আপনি ঠিক বলেছেন, @ বেঞ্জামিন ডাব্লু। ভেরিয়েবলের জন্য ডাবল কোট ব্যবহার করা ভাল ধারণা কেন কেবল শব্দ বিভাজন নয়। একটি ভেরিয়েবল ফাঁকা থাকার ক্ষেত্রেও রয়েছে। এটি [] এর বিবৃতিটিকে ব্যর্থ করে তুলবে (উদাহরণস্বরূপ [২ -q] একটি ত্রুটিযুক্ত করে, তবে [[]] ঝুঁকিপূর্ণ নয় (শব্দ বিভাজনের ক্ষেত্রে যেমন হয়েছে)
সুডোডাস

2
@ মার্কসেলাম, বাশ, কেএসএস এবং জশ এর পূর্ণসংখ্যার ভেরিয়েবল রয়েছে এবং এগুলির মধ্যেও পূর্ণসংখ্যার অপারেশনগুলিকে [[ ]]বাধ্য করে -eq
ইলকচাচু

উত্তর:


7

শব্দ বিভাজন।

এই উদাহরণটি খুব অসম্ভব, তবে সম্ভব , সুতরাং আপনি যদি সুরক্ষামূলকভাবে কোড করতে চান, আপনার ট্র্যাকগুলি উদ্ধৃতি দিয়ে কভার করুন:

$ set -x
$ value1=5
+ value1=5
$ value2=3
+ value2=3
$ [ $value1 -eq $value2 ]
+ '[' 5 -eq 3 ']'

ঠিক আছে, এখন পর্যন্ত সব ভাল। চলুন গিরিগুলিতে রেঞ্চটি ফেলে দিন:

$ IFS=456
+ IFS=456
$ [ $value1 -eq $value2 ]
+ '[' '' -eq 3 ']'
bash: [: : integer expression expected

উফ।

$ [ "$value1" -eq "$value2" ]
+ '[' 5 -eq 3 ']'

আহা।


2
তবে ওপি ডাবল বন্ধনী ব্যবহার করে, তাই কোনও শব্দ বিভাজন ঘটে না।
user000001

5
হ্যাঁ, এটি বাশের [[ ]]নির্মাণের সাথে সত্যই প্রাসঙ্গিক নয় ।
terdon

1
অঁ্যা? [ $value1 -eq $value2 ]একটি খালি সঙ্গে বাম দিকে কোন সাথে value1হবে । '[' -eq 3 ']'''
চার্লস ডাফি

আমিও অবাক হয়েছি, তবে এর প্রমাণও আছে।
গ্লেন জ্যাকম্যান

1
এই উত্তরটি সরাসরি প্রশ্নের সাথে সম্পর্কিত নয় । আমি অবাক হয়েছি এটি গৃহীত হয়েছিল। সম্প্রদায় উইকি হিসাবে সেট করা হচ্ছে।
গ্লেন জ্যাকম্যান

35

আপনার এখানে আসলে উদ্ধৃতিগুলির দরকার নেই। এটি খুব কম কয়েকটি ক্ষেত্রে একটি যেখানে অকার্যকর চলক ব্যবহার করা নিরাপদ। আপনি এটি দিয়ে নিশ্চিত করতে পারেন set -x:

$ var1=""
$ var2="3"
$ set -x
$ if [[ $var1 -eq $var2 ]]; then echo "match!"; else echo "no match!"; fi
+ [[ '' -eq 3 ]]
+ echo 'no match!'
no match!
$ if [[ "$var1" -eq "$var2" ]]; then echo "match!"; else echo "no match!"; fi
+ [[ '' -eq 3 ]]
+ echo 'no match!'
no match!

আপনি উপরে দেখতে পারেন, পরীক্ষার উদ্ধৃত এবং উদ্ধৃত সংস্করণগুলি ঠিক একই জিনিসটিতে বাশ দিয়ে সমাধান করা হয়েছে। একই হিসাবে সত্য হওয়া উচিত zshএবং, আমি মনে করি, [[ ]]অপারেটরকে সমর্থন করে এমন কোনও শেল ।

মনে রাখবেন যে আরও পোর্টেবলের ক্ষেত্রে এটি নয়[ ] :

$ if [ $var1 -eq $var2 ]; then echo "match!"; else echo "no match!"; fi
+ '[' -eq 3 ']'
sh: [: -eq: unary operator expected
+ echo 'no match!'
no match!

[ ]কনস্ট্রাক্ট, অসদৃশ [[ ]]এক, মূল্য উদ্ধৃতি প্রয়োজন নেই।


কখন এবং কেন উদ্ধৃতি আবশ্যক সে সম্পর্কে আরও জানার জন্য কয়েকটি দরকারী লিঙ্ক:


এই ক্ষেত্রে পূর্ণসংখ্যার ভেরিয়েবলগুলির সাথে তাদের এ জাতীয় হিসাবে ঘোষণা করা ভাল। declare -i var1=হয় 0যখন মূল্যায়ন।
ফ্রেডি

4
লক্ষ্য করুন -eqহয় গাণিতিক তুলনা, যাতে আপনি এমনকি চলে যাবে $আউট (ইন [[ .. ]]), এবং লেখার [[ a -eq b ]]। স্ট্রিং তুলনা সঙ্গে, আপনার $অবশ্যই প্রয়োজন, তাই[[ $a = $b ]]
ইলক্কাচু

2
@ ব্যবহারকারী000001 ভাল পয়েন্ট। যদিও, অবশ্যই, এটা খুব সম্ভব যে আপনার চান সেই প্রসারিত করা হয়েছে। উদাহরণস্বরূপ, আমি এটি কোনো মিল হতে আশা করবে: var1="afoob"; var2="a*b"; [[ $var1 = $var2 ]] && echo match। যদি আপনি গ্লোব চরিত্রগুলিকে কোনও গ্লোববিং প্রসঙ্গে (যেমন হিসাবে [[ ]]) গ্লোব হিসাবে অভিনয় না করে ব্যবহার করতে চান তবে আপনার উদ্ধৃত করা দরকার, হ্যাঁ।
terdon

3
@ ইলক্কাছু, তা আমাকে অবাক করে। আমি ভেবেছিলাম যে "বেয়ার" ভেরিয়েবলগুলি কেবল একটি অ্যারে সাবস্ক্রিপ্ট বা এর মধ্যে বিবেচনা করা হবে ((...))বা $((...)। এটি কাজ করে বলে মনে হচ্ছে, তবে (বৃদ্ধ বুড়ো মানুষটি সক্ষম করুন) আমি এটি পছন্দ করি না।
গ্লেন জ্যাকম্যান

1
@glennjackman, ভাল, আপনাকে এই কথাটি বলে একজন বলে দুঃখিত, তবে হ্যাঁ, -eqঅভ্যন্তরীণ বন্ধুরা এবং তার বন্ধুরাও [[ ]]পাটিগণিত সংক্রান্ত বিষয়। :) (সম্পর্কিত:
বাশের

17

যদিও ডাবল উক্তিগুলি প্রয়োজনীয় নয়, সেগুলি ব্যবহারের কারণগুলি হ'ল:

  • ভাল অভ্যাস / অভ্যাস: ইন এই ক্ষেত্রে তারা প্রয়োজনীয় নয়, তবে সাধারণভাবে উদ্ধৃতি চিহ্ন দ্বারা অনিচ্ছাকৃত শব্দ বিভাজন এড়ানো।
  • কারণ value1এবং value2পরিবর্তনশীল এবং আপনার কী থাকতে পারে তা আপনি জানেন না। অন্যথায় আপনি আরও জিজ্ঞাসা করতে পারেন, "পরীক্ষা if [[ 5 -eq 3 ]]করার পরিবর্তে ভেরিয়েবলগুলি নিয়ে কেন বিরক্ত করবেন ? বা এটি আরও গ্রহণ করুন, ifআপনি ইতিমধ্যে জানেন যে 5 টি 3 এর সমান নয়? কেন এটি প্রতিরক্ষামূলক হওয়া বেশ ভাল often" এটি সত্য শব্দ বিভাজন ঘটবে না [[, তবে শব্দ বিভাজন ঘটে না এমন ক্ষেত্রে বিরল দেখা যায়। আবার, প্রথম বিষয়টি দেখুন))

1

আপনার প্রশ্নের সাথে সরাসরি সম্পর্কিত নয়, তবে আমি ব্যবহার করি

যদি (($ মান 1 == $ মান 2)); তারপর

যখন আমি সংখ্যার তুলনা করি তবে সেখানে আপনাকে উদ্ধৃতিও ব্যবহার করতে হবে না।


2
if (( value1 == value2 )); then। পাটিগণিত প্রসঙ্গে, আপনার এমনকি প্রয়োজনও নেই $। এই প্রশ্নটি অবশ্য [[ ... ]]পরীক্ষার মধ্যে ব্যবহৃত ভেরিয়েবলগুলিতে ফোকাস করে ।
কুসালানন্দ

1
আমি জানি. তবে আমি খোলামেলাভাবে এই বৈশিষ্ট্যটি ব্যবহার করি না কারণ আমি চাইব আমার চলক নামগুলি সামঞ্জস্যপূর্ণ হোক এবং এভাবে সর্বদা উপসর্গ হিসাবে ব্যবহার করতে পারি।
ফ্রেম্প

1

তুমি একদম সঠিক!

ডাবল স্কোয়ার ব্র্যাকেটের মধ্যে উদ্ধৃতি দেওয়া মোটেই অর্থহীন নয়, অন্তত এই ক্ষেত্রে least

তবে যেহেতু আমি প্রতিদিন ডাবল কোট ব্যবহার করি - বিশেষত একক বর্গাকার বন্ধনীর অভিব্যক্তিগুলির জন্য, ফাংশন এবং স্ক্রিপ্টগুলিতে তর্কগুলি যুক্ত করে সেইসাথে কখনও কখনও পরিবর্তনশীল অ্যাসাইনমেন্ট (যা সাধারণ বিভাজনের জন্য সম্পূর্ণ অকেজো) - আমার ধারণা কিছু লোক, কমপক্ষে আমিও করি, স্বতঃস্ফূর্তভাবে পরিবর্তনশীল বিস্তারের চারপাশে ডাবল উক্তি লিখুন

ডাবল উদ্ধৃতি আপনাকে সঞ্চয়ীতার ধারণা দিতে পারে। এটি বাড়িতে আসার মতো যেখানে ডাবল কোট রয়েছে। - ডি কুমার

ফলস্বরূপ এবং বোধগম্যভাবে ডাবল কোটগুলি করার সুবিধা - তবে কেবল এটি বোধগম্য হয় - যে সহকর্মীরা যারা ব্যাশে নতুন তারা আরও স্থিতিশীল স্ক্রিপ্টগুলি কীভাবে লিখবেন তা শিখতে পারেন । এছাড়া যে accentuates ডেটার শিল্প ব্যাশ সঙ্গে প্রক্রিয়াকরণের সম্পর্কে আরো ক্ষেত্রের বিভাজক এবং তাদের নল দ্বারা (ভেরিয়েবল সহ) ডেটা স্ট্রিম পৃথক ফিল্টারগুলির মাধ্যেমে । আপনার ডেটা খণ্ডগুলি স্ট্রিম থেকে আলাদা হয়ে যাওয়ার সাথে সাথে এগুলিকে ডাবল উদ্ধৃতি দিয়ে ধরে রাখুন!

আরেকটি সুবিধা হ'ল একটি কোড হাইলাইটিং এডিটরের মধ্যে ডাবল উদ্ধৃত স্ট্রিং সহ ব্যাশ স্ক্রিপ্টগুলির আরও ভাল পঠনযোগ্যতা ।

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