আমি এ সম্পর্কে বাশ উদাহরণগুলি পড়ছি if
তবে কয়েকটি উদাহরণ একক বর্গাকার বন্ধনীতে লেখা রয়েছে:
if [ -f $param ]
then
#...
fi
ডাবল স্কোয়ার বন্ধনী সহ অন্যরা:
if [[ $? -ne 0 ]]
then
start looking for errors in yourlog
fi
পার্থক্য কি?
আমি এ সম্পর্কে বাশ উদাহরণগুলি পড়ছি if
তবে কয়েকটি উদাহরণ একক বর্গাকার বন্ধনীতে লেখা রয়েছে:
if [ -f $param ]
then
#...
fi
ডাবল স্কোয়ার বন্ধনী সহ অন্যরা:
if [[ $? -ne 0 ]]
then
start looking for errors in yourlog
fi
পার্থক্য কি?
উত্তর:
একক []
posix অনুবর্তী শর্ত পরীক্ষা শেল হয়।
ডাবল [[]]
স্ট্যান্ডার্ডের একটি এক্সটেনশন []
এবং বাশ এবং অন্যান্য শেল (যেমন zsh, ksh) দ্বারা সমর্থিত। তারা অতিরিক্ত অপারেশনগুলিকে সমর্থন করে (পাশাপাশি স্ট্যান্ডার্ড পোস্টিক্স অপারেশনগুলি)। উদাহরণস্বরূপ: এর ||
পরিবর্তে -o
এবং এর সাথে রিজেক্সের মিল =~
। শর্তসাপেক্ষে নির্মাণ সংক্রান্ত বাশ ম্যানুয়াল বিভাগে পার্থক্যের একটি পূর্ণাঙ্গ তালিকা পাওয়া যাবে ।
[]
যখনই আপনি চান আপনার স্ক্রিপ্টটি শেলগুলি জুড়ে পোর্টেবল হতে পারে Use ব্যবহারের [[]]
আপনি দ্বারা সমর্থিত নয় শর্তাধীন অভিব্যক্তি চান []
এবং না পোর্টেবল হতে হবে।
[[ ]]
(উদাহরণস্বরূপ বাশ দিয়ে #!/bin/bash
বা #!/usr/bin/env bash
), আপনার পোর্টেবল বিকল্পটি ব্যবহার করা উচিত। যে স্ক্রিপ্টগুলি ধরে নিয়েছে / বিন / এস এই জাতীয় এক্সটেনশানগুলিকে সমর্থন করে তা সাম্প্রতিক ডেবিয়ান এবং উবুন্টু রিলিজের মতো ওএসগুলিতে বিভক্ত হবে যেখানে ঘটনাটি নেই।
আচরণের পার্থক্য
4.3.11 বাশে পরীক্ষিত:
পসিক্স বনাম বাশ এক্সটেনশান:
[
পসিক্স[[
এটি একটি বাশ এক্সটেনশন ¹ নথিভুক্ত: https://www.gnu.org/software/bash/manual/bash.html# শর্তসাপেক্ষে- চুক্তিগুলিনিয়মিত কমান্ড বনাম যাদু
[
একটি অদ্ভুত নাম সহ একটি নিয়মিত আদেশ।
]
এটি কেবলমাত্র একটি যুক্তিই হ'ল [
আরও যুক্তি ব্যবহার করা থেকে বাধা দেয়।
কোরবানিলগুলি সরবরাহ করে উবুন্টু ১.0.০৪ এর পক্ষে এটির জন্য আসলে একটি এক্সিকিউটেবল থাকে /usr/bin/[
, তবে ব্যাশ অন্তর্নির্মিত সংস্করণটিকে প্রাধান্য দেয়।
বাশ যেভাবে কমান্ডটি পার্স করে তাতে কিছুই পরিবর্তন হয় না।
বিশেষত, <
পুনর্নির্দেশ, &&
এবং ||
একাধিক কমান্ডকে ( )
একত্রিত করা , সাবস্কেল উত্পন্ন করে যদি না পালিত হয় \
এবং শব্দ প্রসারণটি যথারীতি ঘটে।
[[ X ]]
এটি একটি একক নির্মাণ যা X
যাদুতে পার্স করা যায়। <
, &&
, ||
এবং ()
বিশেষভাবে চিকিত্সা করা হয়, এবং শব্দ বিভাজন নিয়ম ভিন্ন।
মত =
এবং আরও পার্থক্য আছে =~
।
বাশেসে: [
একটি অন্তর্নির্মিত কমান্ড, এবং [[
এটি একটি কীওয়ার্ড: /ubuntu/445749/whats-the-differences-between- Shell - builtin- and- shell - keyword
<
[[ a < b ]]
: অভিধানিক তুলনা[ a \< b ]
: উপরের মতই. \
অন্যথায় অন্য কমান্ডের মতো পুনঃনির্দেশ প্রয়োজন required বাশ এক্সটেনশন।expr a \< b > /dev/null
: পসিক্স সমতুল্য, দেখুন: বাশের চেয়ে কম বা সমান কোষের জন্য ডিকশনারগুলি কীভাবে পরীক্ষা করতে হবে?&&
এবং ||
[[ 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 ]
সমতুল্য হবে।
[]
আমার পছন্দ হিসাবে পড়া উচিত : []
আপনি বহনযোগ্যতা হারাতে না চাইলে ব্যবহার করুন । এখানে যেমন বলা হয়েছে : পসিক্স বা বোর্নশেলের কাছে পোর্টেবিলিটি / কনফারেন্সেশন যদি উদ্বেগজনক হয় তবে পুরানো বাক্য গঠনটি ব্যবহার করা উচিত। অন্যদিকে স্ক্রিপ্টে যদি BASH, Zsh, বা KornShell প্রয়োজন হয় তবে নতুন সিনট্যাক্সটি সাধারণত আরও নমনীয় হয় তবে অগত্যা পিছনের দিকে সামঞ্জস্য হয় না। আমি [[ ab =~ ab? ]]
যদি এর চেয়ে পিছিয়ে পড়া সামঞ্জস্যতা নিয়ে কোনও উদ্বেগ না পাই তবে আমি যেতে চাইprintf 'ab' | grep -Eq 'ab?'
কন্ডিশন পরীক্ষার জন্য (যেমন [...]) একক বন্ধনীগুলির অভ্যন্তরে, কিছু অপারেটর যেমন একক =
সমস্ত শেল দ্বারা সমর্থিত হয়, তবে অপারেটরের ব্যবহার ==
পুরানো শেলগুলির কয়েকটি দ্বারা সমর্থন করে না।
শর্ত পরীক্ষার জন্য ডাবল বন্ধনীগুলির মধ্যে (যেমন [[...]]), পুরানো বা নতুন শেল ব্যবহারের মধ্যে =
বা কোনও পার্থক্য নেই ==
।
সম্পাদনা: আমার এও লক্ষ্য করা উচিত: ব্যাশে, সর্বদা সম্ভব হলে ডাবল বন্ধনী ব্যবহার করুন [[...]] যদি এটি একক বন্ধনী থেকে নিরাপদ। আমি নীচের উদাহরণ সহ কেন ব্যাখ্যা করব:
if [ $var == "hello" ]; then
যদি $ var শূন্য / ফাঁকা হয়ে যায়, তবে স্ক্রিপ্টটি এটি দেখে:
if [ == "hello" ]; then
যা আপনার স্ক্রিপ্ট ভঙ্গ করবে। সমাধানটি হ'ল হয় ডাবল বন্ধনী ব্যবহার করা, বা সর্বদা আপনার ভেরিয়েবলগুলির চারপাশে উদ্ধৃতি ( "$var"
) লিখতে ভুলবেন না । ডাবল বন্ধনী আরও ভাল প্রতিরক্ষামূলক কোডিং অনুশীলন।
[[
[
কমান্ডের অনুরূপ (তবে আরও শক্তিশালী) বাশ কীওয়ার্ড ।
দেখা
http://mywiki.wooledge.org/BashFAQ/031 এবং http://mywiki.wooledge.org/BashGuide/ পরীক্ষা পরীক্ষা এবং শর্তাদি
আপনি পসিক্স শ এর জন্য লিখছেন না হলে আমরা সুপারিশ করি [[
।
হালকা রেজেক্স ম্যাচের জন্য আপনি ডাবল বর্গাকার বন্ধনী ব্যবহার করতে পারেন, যেমন:
if [[ $1 =~ "foo.*bar" ]] ; then
(যতক্ষণ আপনি ব্যাশের সংস্করণ ব্যবহার করছেন ততক্ষণ এই বাক্য গঠনটি সমর্থন করে)
বাশ ম্যানুয়াল বলেছেন:
[[, '<' এবং '>' অপারেটরগুলি ব্যবহার করে বর্তমান লোকেল ব্যবহার করে শব্দকোষ অনুসারে বাছাই করুন। পরীক্ষা কমান্ডটি ASCII ক্রম ব্যবহার করে।
(পরীক্ষার কমান্ডটি [] এর অনুরূপ)