'&&' এবং ';' এর মধ্যে কি পার্থক্য রয়েছে? একটি স্ট্যান্ডার্ড BASH টার্মিনাল প্রতীক?


56

তারা প্রতীক অনুসরণ করে অন্য কমান্ড দিয়ে শুরু করার জন্য BASH উভয়কেই সিগন্যাল মনে হচ্ছে তবে এর মধ্যে কি আলাদা পার্থক্য রয়েছে?

উত্তর:


75

এই লাইন সহ:

command1 && command2

কমান্ড 2 এক্সিকিউট হবে যদি (এবং কেবলমাত্র) কমান্ড 1 প্রস্থান স্থিতি শূন্য ফিরে আসে তবে এই লাইনে:

command1 ; command2

কমান্ড 1 এবং কমান্ড 2 উভয়ই নির্বিশেষে কার্যকর করা হবে। সেমিকোলন আপনাকে এক লাইনে অনেক কমান্ড টাইপ করতে দেয়।


1
মজাদার! আমি ভেবেছিলাম এটি কেবল আরও আরামদায়ক উপায় হতে পারে। ধন্যবাদ!

42

আপনি নিজের জন্য পার্থক্যটি চেষ্টা করতে পারেন:

  1. ls /invalid/path && echo "hello!"
    যেহেতু / অবৈধ / পাথের অস্তিত্ব নেই, ls আপনাকে ডিরেক্টরি তালিকা প্রদর্শন করতে পারে না। এটি একটি ত্রুটি বার্তায় ব্যর্থ হবে: "ls: / अवैध / পথ: এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই"। দ্বিতীয়ার্ধে কমান্ডের ( "হ্যালো!" Echo) করা হয় এমনকি মৃত্যুদন্ড কার্যকর না কারণ প্রথমার্ধে ব্যর্থ হয়েছে।

  2. ls /invalid/path ; echo "hello!"
    আগের মতো একই ত্রুটি বার্তা উপস্থিত হয়, তবে এবার দ্বিতীয় অংশটি কার্যকর করা হয়েছে !
    ls: / अवैध / পথ: এই জাতীয় কোনও ফাইল বা ডিরেক্টরি
    হ্যালো!

কেন এটি দরকারী?
মনে করুন আপনি আর্কাইভ.আর্টরডজ নামে একটি ফাইল বের করতে চান আপনি
কমান্ডটি ব্যবহার করতে পারেন tar zxvf archive.tar.gz && rm archive.tar.gz
যদি কোনও কারণে সংরক্ষণাগার নিষ্কাশন ব্যর্থ হয়, দ্বিতীয় অংশটি কার্যকর হয় না! আপনি আবার চেষ্টা করতে পারেন।

যদি আপনি ব্যবহার; একই পরিস্থিতিতে, সংরক্ষণাগারটি মোছা হয়েছে এবং আপনি আবার চেষ্টা করতে পারবেন না।


8

&&এর ANDঅর্থ, দ্বিতীয় কমান্ড কেবল তখনই কার্যকর করা হবে যদি প্রথমটি সত্যটি ফিরে আসে (কোনও ত্রুটি নেই)।


1
&& হ'ল "তবে" (একটি "এবং" নয়) ... আমার উত্তরটি দেখুন
পিটার.ও

2
@ ফ্রেড আমি বলব এটি একটি "এবং" শর্ট সার্কিট মূল্যায়ন সহ - যদি প্রথম অংশটি সত্য না হয় তবে এটি জানে যে মোট ফলাফল অবশ্যই মিথ্যা হতে পারে, সুতরাং এটি দ্বিতীয় অংশটি এড়িয়ে যায়। তবে একমত যে "এরপরে" হিসাবে এটি ভাবনা এই প্রসঙ্গে খুব কমই পার্থক্য করে।
jg-faustus

2
@ ফ্রেড যদিও ধারণাগতভাবে এটি সেভাবে বোঝা সহজ হতে পারে তবে আমি আপনার বক্তব্যের সাথে একমত নই। ধারণাটি হ'ল যে কোনও AND প্রয়োগের সাথে ২ য় প্যারামিটার অপ্রাসঙ্গিক হয়ে যায় যদি প্রথমটির সমান হয় falseএবং সুতরাং অন্তর্নিহিত কোডটি দ্বিতীয় প্যারামিটারের মূল্যায়ন স্থগিত করতে অপ্টিমাইজড হয়ে যায় যতক্ষণ না এটি প্রথমটি কী তা জানে what
ওয়ার্ড মুয়িলার্ট

2
@ ফ্রেড আমি নিশ্চিত নই যে সেই উদাহরণটি কী উত্থাপন করার চেষ্টা করছে। &&কেবল একটি বাইনারি অপারেটর, একটি ফাংশন। কেবলমাত্র "বিশেষ" জিনিসটি হ'ল এটি হল ইনফিক্স নোটেশন (যা এই ধরণের বেশিরভাগ অপারেটরের পক্ষে মানক) এবং দ্বিতীয় অপারেন্ডের কার্যকারিতা বিলম্বিত। বিলম্বিত মৃত্যুদণ্ড কার্যকরভাবে এটিকে এমন কিছু হিসাবে ব্যবহার করার ক্ষমতা দেয় যা ধারণাগতভাবে এই প্রসঙ্গে একটি ifবিবৃতি হিসাবে দেখা যেতে পারে , তবে এটি মূলত উদ্দিষ্ট ব্যবহারের বাস্তব শর্তের মধ্যে থাকা এই সত্য থেকে দূরে সরে যায় না । এখানে ব্যবহার সত্যিই একটি "হ্যাক" এর বেশি। if
ওয়ার্ড মুয়িলার্ট

3
@ ফ্রেড অবশ্যই এটি কোনও তিনটি অপারেটর নয়, এটি কেবল দুটি অপারেশনের উত্তরসূরি a && b || c = (a && b) || c। মূল্যায়নের সরল ক্রম। সত্যিই সেখানে কোন রহস্য নেই। আপনি যদি এগুলি আপনার সাধারণ ফাংশনগুলির মতো লেখেন তবে এটি দেখতে সহজ হবে or(and(a, b), c)। এই লজিক একটি মধ্যে একই ifকারণ যখন এটি সোজা কমান্ড লাইন মধ্যে প্রবেশ সেইসাথে শর্তসাপেক্ষ &&এবং ||হয় অপারেটার ঐ দুই operands গ্রহণ করা এবং তারা অন্য ফিরে যান।
ওয়ার্ড মুয়িলার্ট

8

আপডেট : আমি সম্ভাব্য কয়েকটি ফাঁদ উচ্চারণে স্ক্রিপ্ট হিসাবে যুক্ত করেছি:

কারণ অন্য কেউ "||" উল্লেখ করেনি, আমি করব

আপডেট 2 : এখানে কিছু গুরুত্বপূর্ণ পুনরায় শব্দাবদ্ধ
&& এর "একটি" যদি "সত্য" তে সাড়া দেয় এমন "বিবৃতি"

|| হয় না একটি "যদি" statment .. এর "কিছু" পছন্দ
|| একটি "যদি" বিবৃতি "মিথ্যা" প্রতিক্রিয়া যা "তারপর" মত

আরও সুনির্দিষ্ট, && tests পরীক্ষা করে? পূর্ববর্তী সর্বাধিক সম্পাদিত বিবৃতিটির রিটার্ন মানটি &&& অনুসরণ করে তাত্ক্ষণিকভাবে স্টেটমেন্ট বা সাব-শেলকে নিয়ন্ত্রণ দেয় ... এটি কেবলমাত্র passes হলে নিয়ন্ত্রণ পাস করে? সত্য.

|| অনুরূপ, এবং প্রায়শই একটি && বিবৃতি অনুসরণ করে দেখা যায়, তবে এটি আগের সর্বাধিক সম্পাদিত বিবৃতি থেকে একটি মিথ্যা রিটার্ন মান ($?) জন্য পরীক্ষা করে ... এনবি! , নোটা বেন! ভালভাবে দ্রষ্টব্য! .... যদি পূর্বাভাস বিবৃতিটি এমন একটি && বিবৃতি হয় যা মিথ্যা পিছনে ফিরে আসে যখন আপনি এটি সত্য হওয়ার প্রত্যাশা করেন, তবে || মিথ্যাটির প্রতিক্রিয়া জানাবে, সুতরাং একই লাইনে উভয়ই মিশ্রণ ঝুঁকিপূর্ণ হতে পারে

আমি যে মূল বক্তব্যটি চেষ্টা করার চেষ্টা করছি সেটি আমার একটি ভুল সম্পর্কিত। অর্থাত:
## [[শর্ত]] ও & এ || বি
হয় না একটি সি / C ++ শৈলীর তিন মত আচরণ করে না। ie:
// (শর্ত)? উত্তর: বি
"এ" থেকে "অপ্রত্যাশিত" ফলাফলের উদাহরণগুলির জন্য নীচের স্ক্রিপ্টটি দেখুন

বুনিয়াদি পরীক্ষা এবং && এবং || বিবৃতি অবশ্যই একই লাইনে থাকতে হবে ...


&& এবং || ব্যবহার করার সময় জিনিসগুলি কোথায় ভুল হতে পারে তা দেখতে এই স্ক্রিপ্টটি চালান সম্প্রতি সম্পাদিত বিবৃতি এক আশা নাও হতে পারে ..

[[শর্ত]] ও & প্রতিধ্বনি হ্যালো || প্রতিধ্বনি বিদায় .... সাধারণত নিরাপদ,
একটি ভাল গঠিত প্রতিধ্বনি সত্য ফিরে আসবে।
কিন্তু ফাইলটি অ্যাক্সেস সম্পর্কে কী বলা যায় না?

#!/bin/bash
#
# "as expected" return codes" means: expected to behave like a normal AND / OR  contition test
#
if [[ "$1" != "" ]] ; then exit $1; fi # recursive call to return an arbitary $? value (decimal)
echo
echo 'test 1: All return codes are "as expected"'
echo  ======
 ((1==1)) && echo  " ((1==1)) rc=$? ..&&.. condition is true" || echo  " ((1==1)) rc=$? ..||.. condition is false"
  $0  0   && echo "  \$0  0   rc=$? ..&&.. condition is true" || echo "  \$0  0   rc=$? ..||.. condition is false"
 ((1!=1)) && echo  " ((1!=1)) rc=$? ..&&.. condition is true" || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  $0  1   && echo "  \$0  1   rc=$? ..&&.. condition is true" || echo "  \$0  1   rc=$? ..||.. condition is false"
echo
echo 'test 2: Now throw in some "unexpected" errors into the first of the &&/|| pair' 
echo  ======
 ((1==1)) && (echo  " ((1==1)) rc=$? ..&&.. condition is true"; $0 1)  || echo  " ((1==1)) rc=$? ..||.. condition is false"
  $0  0   && (echo "  \$0  0   rc=$? ..&&.. condition is true"; $0 2)  || echo "  \$0  0   rc=$? ..||.. condition is false"
 ((1!=1)) && (echo  " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3)  || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  $0  1   && (echo "  \$0  1   rc=$? ..&&.. condition is true"; $0 4)  || echo "  \$0  1   rc=$? ..||.. condition is false"
echo
echo 'test 3: Now swap the order of && and || statements, using "as expected" return codes'
echo  ======
 ((1==1)) || echo  " ((1==1)) rc=$? ..||.. condition is true" && echo  " ((1==1)) rc=$? ..&&.. condition is false"
  $0  0   || echo "  \$0  0   rc=$? ..||.. condition is true" && echo "  \$0  0   rc=$? ..&&.. condition is false"
 ((1!=1)) || echo  " ((1!=1)) rc=$? ..||.. condition is true" && echo  " ((1!=1)) rc=$? ..&&.. condition is false"
  $0  1   || echo "  \$0  1   rc=$? ..||.. condition is true" && echo "  \$0  1   rc=$? ..&&.. condition is false"
echo
echo 'test 4: With the order of && and || statements still swapped, introduce "unexpected" errors into the first of the &&/|| pair' 
echo  ======
 ((1==1)) && (echo  " ((1==1)) rc=$? ..&&.. condition is true"; $0 1)  || echo  " ((1==1)) rc=$? ..||.. condition is false"
  $0  0   && (echo "  \$0  0   rc=$? ..&&.. condition is true"; $0 2)  || echo "  \$0  0   rc=$? ..||.. condition is false"
 ((1!=1)) && (echo  " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3)  || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  $0  1   && (echo "  \$0  1   rc=$? ..&&.. condition is true"; $0 4)  || echo "  \$0  1   rc=$? ..||.. condition is false"

exit 


1

চেষ্টা

মিথ্যা && "প্রতিধ্বনি" প্রতিধ্বনি

এবং

মিথ্যা প্রতিধ্বনি "হ্যালো"

পার্থক্যটা দেখ


0

কমান্ডটি (কোনও স্ক্রিপ্টের ক্ষেত্রে ফাংশন) পরে &&প্রথম কমান্ডের RETVAL (ফাংশন, স্ক্রিপ্টের ক্ষেত্রে) এর উপর নির্ভর করে কার্যকর করা হয়। এটি সফল হলে প্রথম কমান্ডকে 0 এর মান ফেরত দিতে বাধ্য করে। আমরা আরও কমান্ড কার্যকর করতে রিটার্ন মানটি পরীক্ষা করতে পারি।

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