আমি ঠিক ভাবলাম ঠিক কি মধ্যে পার্থক্য
[[ $STRING != foo ]]
এবং
[ $STRING != foo ]
এটি বাদে প্যাসিক্স-কমপ্লায়েন্ট, শের মধ্যে পাওয়া যায় এবং পূর্ববর্তীটি ব্যাশের মধ্যে পাওয়া এক্সটেনশন।
আমি ঠিক ভাবলাম ঠিক কি মধ্যে পার্থক্য
[[ $STRING != foo ]]
এবং
[ $STRING != foo ]
এটি বাদে প্যাসিক্স-কমপ্লায়েন্ট, শের মধ্যে পাওয়া যায় এবং পূর্ববর্তীটি ব্যাশের মধ্যে পাওয়া এক্সটেনশন।
উত্তর:
বিভিন্ন পার্থক্য আছে। আমার মতে, কয়েকটি অতি গুরুত্বপূর্ণ:
[
বাশ এবং অন্যান্য অনেক আধুনিক শেলের একটি অন্তর্নির্মিত। বিল্টিনটি বন্ধ হওয়ার অতিরিক্ত প্রয়োজনীয়তার সাথে [
সমান । বিল্টিনগুলি এবং কার্যকারিতা এবং তাদের সীমাবদ্ধতার সাথে অনুকরণ করে যাতে স্ক্রিপ্টগুলি পিছনের দিকে সামঞ্জস্যপূর্ণ হয়। মূল এক্সিকিউটেবলগুলি এখনও বেশিরভাগই পসিক্স সম্মতি এবং পিছনে সামঞ্জস্যের জন্য বিদ্যমান exist কমান্ডটি বাশ-এ চালানো ইঙ্গিত দেয় যে এটি বিল্টিন হিসাবে ডিফল্টরূপে ব্যাখ্যা করা হয়। (দ্রষ্টব্য: কেবল PATH এ এক্সিকিউটেবলের সন্ধান করে এবং এর সমতুল্য )test
]
[
test
/bin/[
/bin/test
type [
[
which [
type -p [
[[
হিসাবে সামঞ্জস্যপূর্ণ না, এটি অগত্যা যা /bin/sh
পয়েন্ট যাই হোক না কেন সঙ্গে কাজ করবে না । তাই [[
আরো আধুনিক ব্যাশ / Zsh / ksh বিকল্প।[[
শেলটি তৈরি করা হয়েছে এবং এর উত্তরাধিকার প্রয়োজনীয়তা নেই, তাই স্পেসের সাথে একটি স্ট্রিংয়ের মূল্যায়নকারী ভেরিয়েবলগুলিতে বিড়বিড় করতে আইএফএস ভেরিয়েবলের ভিত্তিতে শব্দ বিভাজন সম্পর্কে আপনার চিন্তা করার দরকার নেই । অতএব, আপনার সত্যিকারের ডাবল উদ্ধৃতিতে ভেরিয়েবল রাখার দরকার নেই।বেশিরভাগ অংশের জন্য, বাকীটি কেবল কিছু ভাল সিনট্যাক্স। আরও পার্থক্য দেখতে, আমি একটি FAQ উত্তরের এই লিঙ্কটি সুপারিশ করছি: পরীক্ষার মধ্যে [এবং [[[এর মধ্যে পার্থক্য কী? । আসলে, আপনি যদি বাশ স্ক্রিপ্টিং সম্পর্কে গুরুতর হন তবে আমি FAQ, পিটফলস এবং গাইড সহ পুরো উইকিটি পড়ার পরামর্শ দিচ্ছি । গাইড বিভাগের পরীক্ষার বিভাগটিও এই পার্থক্যগুলি ব্যাখ্যা করে এবং লেখক (গুলি) কেন পোর্টেবল হওয়ার বিষয়ে আপনার যদি চিন্তা করার দরকার না হয় তবে কেন এটি একটি ভাল পছন্দ। প্রধান কারণগুলি হ'ল:[[
< >
ইনপুট পুনঃনির্দেশ হিসাবে মূল্যায়ন না করার জন্য আপনার ব্যাকস্ল্যাশগুলির চেয়ে কম বা তার চেয়ে বেশি পালাতে হবে না , যা ফাইলগুলিকে ওভাররাইট করে কিছু জিনিস সত্যিই গণ্ডগোল করতে পারে। এটি আবার [[
বিল্টিন হয়ে ফিরে যায় । যদি [(পরীক্ষা) একটি বাহ্যিক প্রোগ্রাম হয় তবে শেলটিকে যেমন মূল্যায়ন করা হয় তার ব্যতিক্রম করতে হবে <
এবং >
কেবল যদি /bin/test
ডাকা হয় তখন এটি সত্যিকার অর্থে আসে না।সংক্ষেপে:
[বাশ বিল্টিন ilt
[[]] হ'ল বাশ কীওয়ার্ড
কীওয়ার্ডস: কীওয়ার্ডগুলি বিল্টিনের মতো তবে মূল পার্থক্য হ'ল বিশেষ পার্সিং বিধিগুলি তাদের জন্য প্রযোজ্য। উদাহরণস্বরূপ, [হ'ল ব্যাশ বিল্টিন, যখন [[বাশ কীওয়ার্ড। এগুলি উভয়ই স্টাফ টেস্টিংয়ের জন্য ব্যবহৃত হয়, তবে যেহেতু [[বিল্টিনের পরিবর্তে একটি মূলশব্দ তাই এটি কয়েকটি বিশেষ পার্সিং বিধি থেকে উপকৃত হয় যা এটিকে অনেক সহজ করে তোলে:
$ [ a < b ]
-bash: b: No such file or directory
$ [[ a < b ]]
প্রথম উদাহরণটি একটি ত্রুটি দেয় কারণ বাশ ফাইলটি বি কমান্ড [এ] -এ পুনর্নির্দেশের চেষ্টা করে। দ্বিতীয় উদাহরণটি বাস্তবে আপনি যা আশা করেন তা করে does <অক্ষরটির আর ফাইল পুনঃনির্দেশ অপারেটরের বিশেষ অর্থ নেই।
সূত্র: http://mywiki.wooledge.org/BashGuide/CommandsAndArguments
[
একটি পসিক্স শেল কমান্ড; এটি অন্তর্নির্মিত হওয়া দরকার না ]
just কেবল একটি আর্গুমেন্ট যা সেই আদেশটি সন্ধান করে, যাতে বাক্য গঠনটি ভারসাম্যপূর্ণ হয়। কমান্ডটি একটি সমার্থক শব্দ test
ছাড়া এটি test
বন্ধ হওয়ার সন্ধান করে না ]
।
আচরণের পার্থক্য
4.3.11 বাশে কিছু পার্থক্য:
পসিক্স বনাম বাশ এক্সটেনশান:
[
পসিক্স[[
এটি একটি বাশ এক্সটেনশন ¹ ডকুমেন্টেড: https://www.gnu.org/software/bash/manual/bash.html# শর্তসাপেক্ষে- চুক্তিগুলিনিয়মিত কমান্ড বনাম যাদু
[
একটি অদ্ভুত নাম সহ একটি নিয়মিত আদেশ।
]
এটি কেবলমাত্র একটি যুক্তিই হ'ল [
আরও যুক্তি ব্যবহার করা থেকে বাধা দেয়।
কোরবানিলগুলি সরবরাহ করে উবুন্টু ১.0.০৪ এর পক্ষে এটির জন্য আসলে একটি এক্সিকিউটেবল থাকে /usr/bin/[
, তবে ব্যাশ অন্তর্নির্মিত সংস্করণটিকে প্রাধান্য দেয়।
বাশ যেভাবে কমান্ডটি পার্স করে তাতে কিছুই পরিবর্তন হয় না।
বিশেষত, <
পুনঃনির্দেশ, &&
এবং ||
একাধিক কমান্ডকে ( )
একত্রিত করা , সাবস্কেল জেনারেট করে যদি না এড়িয়ে যায় \
এবং শব্দ প্রসারণটি যথারীতি ঘটে।
[[ X ]]
এটি একটি একক নির্মাণ যা X
যাদুতে পার্স করা যায়। <
, &&
, ||
এবং ()
বিশেষভাবে চিকিত্সা করা হয়, এবং শব্দ বিভাজন নিয়ম ভিন্ন।
মত =
এবং আরও পার্থক্য আছে =~
।
বাশেসে: [
একটি অন্তর্নির্মিত কমান্ড, এবং [[
এটি একটি কীওয়ার্ড: https://askubuntu.com/questions/445749/what-the-differences-between- Shell - builtin- and- shell - keyword
<
[[ a < b ]]
: অভিধানের তুলনা[ a \< b ]
: উপরের মতই. \
অন্যথায় অন্য কমান্ডের মতো পুনঃনির্দেশ প্রয়োজন required বাশ এক্সটেনশন।expr a \< b > /dev/null
: পসিক্স সমতুল্য, দেখুন: https://stackoverflow.com/questions/21294867/how-to-test-strings-for-lexicographic-less-than-or-equal-in-bash/52707989#52707989&&
এবং ||
[[ a = a && b = b ]]
: সত্য, যৌক্তিক এবং[ a = a && b = b ]
: সিনট্যাক্স ত্রুটি, &&
একটি এবং কমান্ড বিভাজক হিসাবে পার্স করা হয়েছেcmd1 && cmd2
[ a = a -a b = b ]
সমতুল্য, তবে POSIX³ দ্বারা অবচয় ³[ a = a ] && [ b = b ]
: পসিক্স এবং নির্ভরযোগ্য সমতুল্য(
[[ (a = a || a = b) && a = b ]]
: মিথ্যা[ ( a = a ) ]
: সিনট্যাক্স ত্রুটি, ()
সাবসেল হিসাবে ব্যাখ্যা করা হয়[ \( a = a -o a = b \) -a a = b ]
সমতুল্য, তবে ()
পসিক্স দ্বারা হ্রাস করা হয়{ [ a = a ] || [ a = b ]; } && [ a = b ]
পসিক্স সমতুল্য 5শব্দের বিভাজন এবং ফাইলের নাম উত্পাদন প্রসারণ (স্প্লিট + গ্লোব)
x='a b'; [[ $x = 'a b' ]]
: সত্য, উদ্ধৃতি প্রয়োজন নেইx='a b'; [ $x = 'a b' ]
: সিনট্যাক্স ত্রুটি, প্রসারিত হয় [ a b = 'a b' ]
x='*'; [ $x = 'a b' ]
: বর্তমান ডিরেক্টরিতে একাধিক ফাইল থাকলে সিনট্যাক্স ত্রুটি।x='a b'; [ "$x" = 'a b' ]
: পসিক্স সমতুল্য=
[[ ab = a? ]]
: সত্য, কারণ এটি প্যাটার্ন ম্যাচিং করে ( * ? [
ম্যাজিক হয়)। বর্তমান ডিরেক্টরিতে ফাইলগুলিতে গ্লোব প্রসারিত হয় না।[ ab = a? ]
: a?
গ্লোব প্রসারিত। সুতরাং বর্তমান ডিরেক্টরিতে থাকা ফাইলগুলির উপর নির্ভর করে সত্য বা মিথ্যা হতে পারে।[ ab = a\? ]
: মিথ্যা, গ্লোব সম্প্রসারণ নয়=
এবং ==
উভয় একই [
এবং [[
কিন্তু ==
একটি ব্যাশ এক্সটেনশান।case ab in (a?) echo match; esac
: পসিক্স সমতুল্য[[ ab =~ 'ab?' ]]
: মিথ্যা 4 , এর সাথে ম্যাজিক হারায়''
[[ ab? =~ 'ab?' ]]
: সত্য=~
[[ ab =~ ab? ]]
: সত্য, POSIX প্রসারিত নিয়মিত অভিব্যক্তি ম্যাচ, ?
গ্লোব বিস্তৃত হয় না[ a =~ a ]
: বাক্যগঠন ত্রুটি. বাশের সমতুল্য নয়।printf 'ab\n' | grep -Eq 'ab?'
: পসিক্স সমতুল্য (শুধুমাত্র একক লাইন ডেটা)awk 'BEGIN{exit !(ARGV[1] ~ ARGV[2])}' ab 'ab?'
: পসিক্স সমতুল্য।প্রস্তাবনা : সর্বদা ব্যবহার []
।
[[ ]]
আমার দেখা প্রতিটি নির্মাণের জন্য পসিক্স সমতুল্য রয়েছে ।
আপনি যদি ব্যবহার করেন [[ ]]
:
[
একটি অদ্ভুত নাম সহ একটি নিয়মিত কমান্ড, কোনও বিশেষ শব্দার্থ জড়িত নয়।Orn [[...]]
কর্ন শেলের সমতুল্য নির্মাণ থেকে অনুপ্রাণিত
² তবে কিছু মান a
বা b
(যেমন +
বা index
) এর জন্য ব্যর্থ হয় এবং সংখ্যাসূচক তুলনা করে a
এবং যদি b
দশমিক পূর্ণসংখ্যার মতো দেখায়। expr "x$a" '<' "x$b"
উভয় কাছাকাছি কাজ করে।
³ এবং কিছু মানের জন্য ব্যর্থ হয় a
বা b
মত !
বা (
।
ব্যাশ ৩.২ এবং তারপরে 4 এবং ব্যাশ 3.1 এর সাথে সামঞ্জস্যতা সরবরাহ করা সক্ষম করা নেই (এর মতো BASH_COMPAT=3.1
)
5 যদিও গোষ্ঠী (এখানে দিয়ে {...;}
কমান্ড দল পরিবর্তে (...)
যা অপ্রয়োজনীয় subshell চালানো হবে) প্রয়োজনীয় হিসাবে নয় ||
এবং &&
শেল অপারেটার (যেমন বিরোধিতা ||
এবং &&
[[...]]
অপারেটরদের বা -o
/ -a
[
অপারেটরদের) সমান প্রাধান্য আছে। সুতরাং [ a = a ] || [ a = b ] && [ a = b ]
সমতুল্য হবে।
printf 'ab' | grep -Eq 'ab?'
মধ্যে if [ … ]
?
if ( printf 'ab' | grep -Eq 'a' ); then echo 'a'; fi
। []
ঠিক যেমন একটি আদেশ grep
। ()
যে কমান্ড আবশ্যক নাও হতে পারে আমি নিশ্চিত নই: আমি কারণ এটি যোগ |
, কিভাবে ব্যাশ জিনিষ parses উপর নির্ভর করে। যদি কিছু না থাকে তবে |
আমি নিশ্চিত যে আপনি কেবল লিখতে পারেন if cmd arg arg; then
।
()
মনে হয়: stackoverflow.com/questions/8965509/...
একক ব্র্যাকেট অর্থাত []
শর্তসাপেক্ষ এক্সপ্রেশন বন্ধ করার জন্য পসিক্স শেল।
ডাবল বন্ধনী অর্থাত [[]]
, এই ব্যাশ এবং অন্যান্য শাঁস (zsh, ksh) দ্বারা সমর্থিত একটি বর্ধিত (অথবা এক্সটেনশন) মান POSIX সংস্করণের সংস্করণ।
ব্যাশ সালে সাংখ্যিক তুলনা আমরা ব্যবহার জন্য eq
, ne
, lt
এবং gt
তুলনা জন্য ডবল বন্ধনী সঙ্গে, আমরা ব্যবহার করতে পারি ==
, !=
, <,
এবং >
আক্ষরিক।
[
পরীক্ষা কমান্ডের প্রতিশব্দ। এমনকি যদি এটি শেলের সাথে অন্তর্নির্মিত হয় তবে এটি একটি নতুন প্রক্রিয়া তৈরি করে।[[
এটির একটি নতুন উন্নত সংস্করণ যা একটি কীওয়ার্ড, কোনও প্রোগ্রাম নয়। উদাহরণ স্বরূপ:
[ var1 lt var2] #works
[ var1 < var2] #error: var2 No such file or directory
[ var1 \< var2] #works with escape
[[ var1 < var2]] #works
if
বিবৃতি প্রসঙ্গে mywiki.wooledge.org/BashPitfalls#if_.5Bgrep_foo_myfile.5D