আমি কীভাবে শেল স্ক্রিপ্টে বুলিয়ান ভেরিয়েবলগুলি ঘোষণা করতে এবং ব্যবহার করতে পারি?


976

আমি নিম্নলিখিত সিনট্যাক্সটি ব্যবহার করে শেল স্ক্রিপ্টে বুলিয়ান ভেরিয়েবল ঘোষণার চেষ্টা করেছি:

variable=$false

variable=$true

এটা কি সঠিক? এছাড়াও, আমি যদি সেই পরিবর্তনশীলটি আপডেট করতে চাইতাম তবে আমি কি একই সিনট্যাক্সটি ব্যবহার করব? অবশেষে, বুলিয়ান ভেরিয়েবলগুলি এক্সপ্রেশন হিসাবে ব্যবহারের জন্য নিম্নলিখিত সিনট্যাক্সটি সঠিক?

if [ $variable ]

if [ !$variable ]

73
হুঁশিয়ার! trueএবং falseসবচেয়ে স্নিপেট প্রেক্ষাপটে নিচে শুধু সাধারণ স্ট্রিং হয় নাbash built-ins !!! নীচে মাইক হল্ট এর উত্তর পড়ুন। (এটি একটি উদাহরণ যেখানে সর্বাধিক ভোটগ্রহণ ও গৃহীত উত্তর হ'ল আইএমএইচও বিভ্রান্তিকর এবং স্বল্প ভোটের উত্তরে অন্তর্দৃষ্টিপূর্ণ বিষয়বস্তুর ছায়া দেওয়া)
এমজেভিভি

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

2
[ true ] && echo yes, true is trueএবং (upppsss) [ false ] && echo yes, false is also true। / বিন / সত্য এবং / বিন / মিথ্যা একটি রিটার্ন কোড দেয় $? ফাংশন জন্য তুলনা জন্য নয়।
এফএমসি

ভেরটি যদি variable=somethingসত্যের থেকে সেট করা থাকে তবে যদি সেট না variable=করা হয় তা মিথ্যা [[ $variable ]] && echo true || echo falseএবং বিপরীত হবে[[ ! $variable ]] && echo false || echo true
ইভান

উত্তর:


1199

সংশোধিত উত্তর (12 ফেব্রুয়ারী, 2014)

the_world_is_flat=true
# ...do something interesting...
if [ "$the_world_is_flat" = true ] ; then
    echo 'Be careful not to fall off!'
fi

আসল উত্তর

ক্যাভেটস: https://stackoverflow.com/a/21210966/89391

the_world_is_flat=true
# ...do something interesting...
if $the_world_is_flat ; then
    echo 'Be careful not to fall off!'
fi

থেকে: বাশে বুলিয়ান ভেরিয়েবল ব্যবহার করা

মূল উত্তরটি এখানে অন্তর্ভুক্ত করার কারণ হ'ল 12 ফেব্রুয়ারী, 2014-র সংশোধন করার আগে মন্তব্যগুলি কেবলমাত্র মূল উত্তরের সাথে সম্পর্কিত এবং সংশোধিত উত্তরের সাথে যুক্ত হওয়ার সাথে অনেক মন্তব্যই ভুল। উদাহরণস্বরূপ, true২ রা জুন, ২০১০ এ ব্যাশ বিল্টিন সম্পর্কে ডেনিস উইলিয়ামসনের মন্তব্য কেবলমাত্র মূল উত্তরের ক্ষেত্রে প্রযোজ্য, সংশোধিত নয়।


37
কি ঘটছে তা বোঝাতে: ifবিবৃতিটি ভেরিয়েবলের বিষয়বস্তু কার্যকর করছে যা বাশ বিল্টিন true। কোনও কমান্ড ভেরিয়েবলের মান হিসাবে সেট করা যেত এবং এর প্রস্থান মূল্য মূল্যায়ন করা হত।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

7
@pms অপারেটরগুলি "-o" এবং "-a" কেবলমাত্র "পরীক্ষা" কমান্ডের জন্য (ওরফে "[]")। পরিবর্তে, এটি "পরীক্ষা +" ছাড়াই এটি "if + কমান্ড"। (। ভালো লেগেছে "যদি, grep foo বিন্যাস ফাইল তখন ...") তাই, ব্যবহার স্বাভাবিক &&এবং ||অপারেটরদের: # t1=true; t2=true; f1=false;# if $t1 || $f1; then echo is_true ; else echo is_false; fi; (যেহেতু T1 = সত্য আয় "সত্যিকারের") # if $t1 && $f1 || $t2; then echo is_true ; else echo is_false; fi (রিটার্ন "সত্য", যেহেতু T2 = সত্য) । আবার, এটি কেবলমাত্র কাজ করে কারণ "সত্য" / "মিথ্যা" বাশ-বিল্টিন (সত্য / মিথ্যা প্রত্যাবর্তন)। আপনি "if $ var ..." ব্যবহার করতে পারবেন না যদি না var একটি সেমিডি হয় (যেমন, সত্য বা মিথ্যা)
মাইকেল 25

14
-1, একটি ব্যাখ্যা জন্য আমার উত্তর দেখুন
ডেনিস

3
এখানে প্রচুর ভুল তথ্য। / বিন / সত্য কার্যকরভাবে ব্যবহার করা হচ্ছে না। ডেনিসের উত্তর দেখুন।
আজকের

1
এই কোডটি এক নয় এবং সংযুক্ত নিবন্ধের মতো একইভাবে কাজ করে না। লিঙ্কযুক্ত কোডটি একটি ভেরিয়েবলের মধ্যে সংরক্ষিত নামে একটি প্রোগ্রামকে কল করে তবে এই উত্তরের কোডটি কেবল স্ট্রিং তুলনা।
কোলোনেল প্রশ্নগুলি

794

টি এল; ডিআর

bool=true

if [ "$bool" = true ]

মিকুর ( মূল ) উত্তর সহ সমস্যাগুলি

আমি গৃহীত উত্তর 1 টি সুপারিশ করি না । এর বাক্য গঠনটি বেশ সুন্দর, তবে এর কিছু ত্রুটি রয়েছে।

বলুন আমাদের নিম্নলিখিত শর্ত রয়েছে।

if $var; then
  echo 'Muahahaha!'
fi

নিম্নলিখিত ক্ষেত্রে 2 , এই শর্তটি নেস্টেড কমান্ড বাস্তব ও বাস্তবায়নের জন্য মূল্যায়ন করবে ।

# Variable var not defined beforehand. Case 1
var=''  # Equivalent to var="".        Case 2
var=    #                              Case 3
unset var  #                           Case 4
var='<some valid command>'  #          Case 5

সাধারণত আপনি কেবল তখনই চান যখন আপনার "বুলিয়ান" পরিবর্তনশীল, varউদাহরণস্বরূপ, স্পষ্টভাবে সত্যে সেট হয়ে গেলে আপনার অবস্থাটি সত্যের কাছে মূল্যায়ন হয় । অন্য সমস্ত মামলা বিপজ্জনকভাবে বিভ্রান্ত করছে!

শেষ কেসটি (# 5) বিশেষত দুষ্টু কারণ এটি ভেরিয়েবলের মধ্যে থাকা কমান্ডটি কার্যকর করবে (এজন্য শর্তটি বৈধ কমান্ড 3, 4 এর জন্য সত্যকে মূল্যায়ন করে )।

এখানে একটি নিরীহ উদাহরণ:

var='echo this text will be displayed when the condition is evaluated'
if $var; then
  echo 'Muahahaha!'
fi

# Outputs:
# this text will be displayed when the condition is evaluated
# Muahahaha!

আপনার ভেরিয়েবলগুলি উদ্ধৃত করা নিরাপদ, যেমন if "$var"; then। উপরের ক্ষেত্রে, আপনার একটি সতর্কতা পাওয়া উচিত যে কমান্ডটি পাওয়া যায় নি। তবে আমরা এখনও আরও ভাল করতে পারি (নীচে আমার প্রস্তাবগুলি দেখুন)।

মিকুর মূল উত্তর সম্পর্কে মাইক হল্টের ব্যাখ্যাও দেখুন।

হবারের উত্তর সহ সমস্যাগুলি

এই পদ্ধতিরও অপ্রত্যাশিত আচরণ রয়েছে।

var=false
if [ $var ]; then
  echo "This won't print, var is false!"
fi

# Outputs:
# This won't print, var is false!

আপনি উপরের শর্তটি মিথ্যা হিসাবে মূল্যায়ন করার প্রত্যাশা করবেন, এভাবে নেস্টেড বিবৃতিটি কখনই কার্যকর করবেন না। আশ্চর্য!

মান ( "false"), ( ভ্যারিয়েবল) উদ্ধৃত করে "$var"বা ব্যবহার করে testবা [[পরিবর্তে [, কোনও পার্থক্য করবেন না।

আমি কি সুপারিশ করি:

আপনার "বুলিয়ানস" চেক করার পরামর্শ দেওয়ার উপায় এখানে রইল। তারা আশানুরূপ কাজ করে।

bool=true

if [ "$bool" = true ]; then
if [ "$bool" = "true" ]; then

if [[ "$bool" = true ]]; then
if [[ "$bool" = "true" ]]; then
if [[ "$bool" == true ]]; then
if [[ "$bool" == "true" ]]; then

if test "$bool" = true; then
if test "$bool" = "true"; then

তারা সবাই বেশ সমতুল্য। অন্যান্য উত্তর 5 এর পদ্ধতির চেয়ে আপনাকে আরও কয়েকটি কীস্ট্রোক টাইপ করতে হবে তবে আপনার কোডটি আরও প্রতিরক্ষামূলক হবে।


পাদটিকা

  1. মিকুর উত্তর তখন থেকে সম্পাদিত হয়েছে এবং এর মধ্যে আর (ত্রুটিযুক্ত) ত্রুটি নেই।
  2. সম্পূর্ণ তালিকা নয়।
  3. এই প্রসঙ্গে একটি বৈধ কমান্ডের অর্থ একটি কমান্ড যা বিদ্যমান। কমান্ডটি সঠিকভাবে বা ভুলভাবে ব্যবহৃত হয়েছে তা বিবেচ্য নয়। উদাহরণস্বরূপ man womanএখনও একটি বৈধ কমান্ড হিসাবে বিবেচিত হবে, এমন কোনও ম্যান পৃষ্ঠা উপস্থিত না থাকলেও।
  4. অবৈধ (অস্তিত্বহীন) কমান্ডগুলির জন্য, বাশ কেবল অভিযোগ করবে যে কমান্ডটি পাওয়া যায় নি।
  5. আপনি যদি দৈর্ঘ্যের বিষয়ে যত্নশীল হন তবে প্রথম প্রস্তাবটি হ'ল সংক্ষিপ্ততম।

8
সহ ব্যবহার ==করা [বা testপোর্টেবল নয়। বহনযোগ্যতা বিবেচনা করা একমাত্র সুবিধা [/ testশেষ হয়েছে [[, সাথে আটকে দিন =
চিপনার

2
@ স্কট আমি আমার প্রাথমিক শেল হিসাবে মাছ ব্যবহার করি , যা আমার মতে বাশের তুলনায় স্ক্যান স্ক্রিপ্টিং ভাষা রয়েছে।
ডেনিস

1
হ্যাঁ, আমি এই লুকানো রসিকতার জন্য আমি কেবল মন্তব্যগুলিতে কোনও প্রশংসা খুঁজে পাইনি, সুতরাং এটি উল্লেখ করতে হয়েছিল =)
ক্রানচ

5
আমার জন্য, ধারণাগতভাবে আমি বুল = "সত্য" ব্যবহার করি তা বোঝা সহজ। তারপরে এটি স্পষ্ট যে এটি কেবল একটি স্ট্রিং এবং কিছু বিশেষ মান বা অন্তর্নির্মিত নয়।
উইসবাকি

1
@ ডলম্যান একদম, আপনি যখন ইনপুটটি নিয়ন্ত্রণ করেন তখন ইনপুট মূল্যায়ন করা ততটা ঝুঁকিপূর্ণ নয়, তবে আমি এখনও এটি একটি খারাপ অভ্যাস হিসাবে বিবেচনা করি যা এটি সহজে এড়ানো যায় যদি এড়ানো উচিত। যে কেউ কেবল পূর্বের স্টাইলটি দেখেছেন এবং ব্যবহার করেছেন সে এর ত্রুটিগুলি সম্পর্কে জানেন না যা অপ্রত্যাশিত আচরণের কারণ হতে পারে।
ডেনিস

175

এখানে বাশ অন্তর্নির্মিত সম্পর্কে আরও কিছু ভুল বোঝাবুঝি হয় trueএবং আরও স্পষ্টতই , বাশ বন্ধনীগুলির মধ্যে কীভাবে এক্সপ্রেশনগুলি ব্যাখ্যা করে এবং ব্যাখ্যা করে।

কোড miku এর উত্তর একেবারে কিছুই ব্যাশ builtin কি আছে true, না /bin/true, কিংবা অন্য কোন গন্ধ trueকমান্ড। এই ক্ষেত্রে, trueএকটি সহজ অক্ষর স্ট্রিং ছাড়া আর কিছুই হয়, এবং কোন কল trueতন্ন তন্ন পরিবর্তনশীল নিয়োগ দ্বারা, কিংবা শর্তাধীন অভিব্যক্তি মূল্যায়ন দ্বারা, কমান্ড / builtin কখনও প্রণীত হয়।

নিম্নলিখিত কোডটি মিকুর উত্তরের কোডটির সাথে কার্যত অভিন্ন:

the_world_is_flat=yeah
if [ "$the_world_is_flat" = yeah ]; then
    echo 'Be careful not to fall off!'
fi

শুধুমাত্র এখানে পার্থক্য হল যে চার অক্ষর তুলনা করা হচ্ছে 'ওয়াই', 'ই', 'একটি', এবং 'জ' পরিবর্তে 'T' এর 'R', 'U', এবং 'ই'। এটাই. কমান্ড বা বিল্টিন নামক কল করার চেষ্টা করা হয়নি yeah, বাশ টোকেনকে পার্স করার সময় কোনও ধরণের বিশেষ হ্যান্ডলিং চলছে না true। এটি কেবল একটি স্ট্রিং, এবং এটিতে সম্পূর্ণ নির্বিচারে।

আপডেট (2014-02-19): মিকুর উত্তরের লিঙ্কটি অনুসরণ করার পরে, এখন আমি দেখছি যে কিছু বিভ্রান্তি আসছে। মিকুর উত্তরে একক বন্ধনী ব্যবহার করা হয়েছে তবে কোড স্নিপেটটি তিনি সংযুক্ত করেছেন যা বন্ধনী ব্যবহার করে না। এটা শুধু:

the_world_is_flat=true
if $the_world_is_flat; then
  echo 'Be careful not to fall off!'
fi

উভয় কোড স্নিপেট একই আচরণ করবে , কিন্তু বন্ধনীগুলি হুডের নীচে কী চলছে তা সম্পূর্ণরূপে পরিবর্তন করে।

প্রতিটি ক্ষেত্রে বাশ কী করছে তা এখানে দেখুন:

বন্ধনী নেই:

  1. ভেরিয়েবলটিকে $the_world_is_flatস্ট্রিংয়ে প্রসারিত করুন "true"
  2. "true"কমান্ড হিসাবে স্ট্রিংকে পার্স করার চেষ্টা করুন ।
  3. trueকমান্ডটি সন্ধান করুন এবং চালনা করুন (কোনও বিল্টিন বা /bin/trueবাশ সংস্করণ অনুসারে)।
  4. trueকমান্ডের প্রস্থান কোডটি (যা সর্বদা 0 থাকে) 0 এর সাথে তুলনা করুন all মনে রাখবেন যে বেশিরভাগ শেলগুলিতে 0 এর একটি প্রস্থান কোড সাফল্য এবং অন্য কোনও কিছু ব্যর্থতা নির্দেশ করে।
  5. যেহেতু প্রস্থান কোড 0 ছিল (সাফল্য), তাই ifবিবৃতিটির thenধারাটি কার্যকর করুন

বন্ধনী:

  1. ভেরিয়েবলটিকে $the_world_is_flatস্ট্রিংয়ে প্রসারিত করুন "true"
  2. এখন সম্পূর্ণ-প্রসারিত শর্তসাপেক্ষ অভিব্যক্তিটি পার্স করুন, যা রূপটি string1 = string2=অপারেটর ব্যাশ কারো নির্দেশ চলে না স্ট্রিং তুলনা অপারেটর। তাই ...
  3. উপর একটি স্ট্রিং তুলনা করবেন না "true"এবং "true"
  4. হ্যাঁ, দুটি স্ট্রিং একই ছিল, সুতরাং শর্তাধীন মানটি সত্য।
  5. সম্পাদন ifবিবৃতি এর thenদফা।

নো-ব্রেকেট কোড কাজ করে, কারণ trueকমান্ডটি 0-র একটি প্রস্থান কোড ফেরৎ দেয় যা সাফল্যকে নির্দেশ করে। বন্ধনীযুক্ত কোডটি কাজ করে, কারণ এর ডানদিকে $the_world_is_flatস্ট্রিং আক্ষরিকের সমান ।true=

কেবল পয়েন্টটি হোম চালনা করতে, নিম্নলিখিত কোডের দুটি স্নিপেট বিবেচনা করুন:

এই কোডটি (যদি রুট সুবিধাগুলি দিয়ে চালিত হয়) আপনার কম্পিউটারটিকে পুনরায় চালু করবে:

var=reboot
if $var; then
  echo 'Muahahaha! You are going down!'
fi

এই কোডটি কেবল "দুর্দান্ত চেষ্টা" প্রিন্ট করে। রিবুট কমান্ড কল করা হয় না।

var=reboot
if [ $var ]; then
  echo 'Nice try.'
fi

আপডেট (২০১৪-০৪-১৪)= এবং ==: এএফআইকে-র মধ্যে পার্থক্য সম্পর্কিত মন্তব্যে প্রশ্নের উত্তর দেওয়ার জন্য , কোনও পার্থক্য নেই। ==অপারেটর একটি ব্যাশ-নির্দিষ্ট সমার্থক হয় =, এবং যতদূর আমি দেখেছি, সব তারা প্রেক্ষিতে ঠিক একই কাজ করে।

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

উদাহরণস্বরূপ, আপনি স্পষ্টতই এর সাথে ভেরিয়েবল অ্যাসাইনমেন্ট করতে পারবেন না ==, যেমন var=="foo"(ভাল প্রযুক্তিগতভাবে আপনি এটি করতে পারেন, তবে এর মান varহবে "=foo", কারণ বাশ ==এখানে কোনও অপারেটর দেখছেন না , এটি একটি =(অ্যাসাইনমেন্ট) অপারেটর দেখছেন , তার পরে রয়েছে) আক্ষরিক মান ="foo", যা কেবল হয়ে যায় "=foo")।

এছাড়াও, যদিও =এবং ==বিনিমেয়, আপনি মনের মধ্যে যে রাখা কিভাবে এই পরীক্ষায় কাজ করা উচিত না কিনা এটা ভিতরে ব্যবহার করছেন উপর নির্ভর করে [ ]বা [[ ]], এবং এছাড়াও উপর থাকুক বা না থাকুক operands উদ্ধৃত করা হয়। আপনি যে সম্বন্ধে আরও পড়তে পারেন মধ্যে উন্নত ব্যাশ স্ক্রিপ্টিং গাইড: 7.3 অন্যান্য তুলনা অপারেটর (আলোচনা নিচে স্ক্রোল করুন =এবং ==)।


নন-ব্রেকেট $the_world_is_flat && echo "you are in flatland!"
পদ্ধতিরও

9
সত্য। যদিও, আমি উভয় পদ্ধতির (বা বিপক্ষে) পক্ষে পরামর্শ দিচ্ছি না। আমি এখানে কিছু ভুল তথ্য যা এখানে ভোট দেওয়া হচ্ছে তা পরিষ্কার করতে চেয়েছিলাম, যাতে এই বিষয়গুলি কীভাবে কার্যকর হয় সে সম্পর্কে পরে যারা এই বিষয়টিতে হোঁচট খায় তারা এই ভ্রান্ত ধারণা থেকে দূরে চলে না যায়।
মাইক হল্ট

1
বিভ্রান্তির কারণ হ'ল মিকুর আসল উত্তরটি 4 বছর দাঁড়িয়েছিল। trueমূল উত্তর সম্পর্কে বিল্টিনের সমস্ত রেফারেন্স তৈরি করা হয়েছিল। (12 ফেব্রুয়ারী, 2014-এ সংশোধিত উত্তর মিকু জমা দেয়নি।) আমি উত্তরটি মূল এবং সংশোধিত উভয়ই অন্তর্ভুক্ত করার জন্য সম্পাদনা করেছি। তারপরে মানুষের মন্তব্যগুলি অর্থবোধ করে।
উইসবাকী

1
এখানে দেওয়া উত্তরগুলি পড়ার পরে, আমি অনুভূতি পেয়েছি যে আসলটি ব্যবহার করে আসলে কিছুই নেই true। কোন উপায় আছে? আমার সন্দেহ হয় যে অনেক প্রোগ্রামার যারা এই উত্তরটি দেখার জন্য কঠোর ভাষাগুলি ব্যবহার করে bashতাদের জীবনকে কিছুটা সহজ করে তুলতে কিছু আঠালো মিশ্রণে সহায়তা করার জন্য একটি ===অপারেটর চান যাতে স্ট্রিংস এবং "বুলিয়ান" আসলে বিনিময়যোগ্য না হয়। তারা শুধু 0 এবং 1 এবং ব্যবহার লাগিয়া থাকা উচিত (( $maybeIAmTrue ))হিসাবে প্রস্তাব Quolonel প্রশ্ন এর উত্তর ?
সেলডমনিডি

2
সেলডমনিডির মন্তব্যটি সম্বোধন করার জন্য, হ্যাঁ, আপনি বাস্তব ব্যবহার করতে পারেন true, তবে সাধারণত পরিবর্তনের সাথে তুলনামূলকভাবে কিছু হিসাবে বিবেচনা করতে পারেন না, কারণ trueপ্রতি সেটের কাছে বাস্তবের কোনও মূল্য নেই। এটি যা করে তা হ'ল প্রস্থান স্থিতি সেট করা 0, সাফল্যের ইঙ্গিত দেয়। এটি লক্ষণীয় যে এটি মূলত তথাকথিত "নাল কমান্ড", বা এর সমতুল্য :। যতদূর ব্যবহার 0এবং এবং 1, আমি আজ আমার সমস্ত স্ক্রিপ্টগুলিতে যা করি যেখানে আমার বুলিয়ান দরকার। এবং আমি মূল্যায়নের (( ))পরিবর্তে অপারেটরটি ব্যবহার করি [[ ]]। সুতরাং, উদাহরণস্বরূপ, যদি আমার কাছে থাকে তবে আমি তা flag=0করতে পারিif (( flag )); then ...
মাইক হল্ট

57

গাণিতিক এক্সপ্রেশন ব্যবহার করুন।

#!/bin/bash

false=0
true=1

((false)) && echo false
((true)) && echo true
((!false)) && echo not false
((!true)) && echo not true

আউটপুট:

সত্য
মিথ্যা নয়


3
পেশাদাররা: (১.) আচরণগুলি বুলগুলি পরিচালনা করার পদ্ধতি সিটির মতো, (২) বাক্য গঠনটি খুব সংক্ষিপ্ত / ন্যূনতম (ডান-হাতের পরিবর্তনশীল এবং '=' বা '==' এর মতো অপারেটরগুলির প্রয়োজন হয় না), (3) ।) <সাবজেক্টিভ> আমার জন্য আমি বুঝতে পারি দীর্ঘ বায়ুবিহীন ব্যাখ্যা ব্যতিরেকে কী ঘটে ... মিকু এবং ডেনিসের উত্তরগুলির বিপরীতে যা উভয়কেই দীর্ঘ বাতাসের ব্যাখ্যা প্রয়োজন বলে মনে হয় </ বিষয়>
ট্রেভর বয়ড স্মিথ

3
@ ট্রেভরবয়েডস্মিথ আপনি কেবল কেন বলেননি, "উপকার: সবকিছু, কনস: কিছুই"। দীর্ঘমেয়াদে আপনার কীবোর্ডে এবং মনিটরে অবমূল্যায়নের ব্যয়গুলি সাশ্রয় করবে।
কোলোনেল প্রশ্ন

4
ইন্টার-ইন্টারেক্টিভ ব্যবহারের জন্য, ওয়ান-লাইনারগুলির মতো, পরে কোনও স্থান রেখে যাওয়ার বিষয়টি নিশ্চিত করুন !বা এটি ইতিহাসের প্রসার ঘটাবে। ((! foo))কাজ করে, তাই করে ! ((foo))। আমি এই সমাধানটি পছন্দ করি, বিটিডাব্লু। শেষ পর্যন্ত বুলিয়ান ভেরিয়েবলগুলি করার একটি সংক্ষিপ্ত উপায়। ((foo || bar))প্রত্যাশার মতো কাজ করে।
পিটার কর্ডস

5
(())পরিবর্তনগুলি পুনরাবৃত্তভাবে প্রসারিত করে, যা আমি প্রত্যাশা করি না। foo=bar; bar=baz; ((foo)) && echo echoকিছুই প্রিন্ট করে না, তবে এটি সত্য baz=1। সুতরাং আপনি সমর্থন করে foo=trueএবং foo=falseপাশাপাশি 0 বা 1 করতে পারেন true=1
পিটার কর্ডস

2
@ কলোনেল খুব সহায়ক সংস্থান হিসাবে আপনাকে ধন্যবাদ। অবশ্যই আমার বোধগম্যতা সীমাবদ্ধ - ডোমেন নির্বিশেষে সমস্ত বোঝায় সীমাবদ্ধ হওয়া মানুষের স্বভাব। তবে, আমার কোন বক্তব্য আপনাকে এই ধারণা নিয়ে নিয়ে যায় যে এই বিশেষ বিষয়ে আমার বোঝার বিষয়টি অসম্পূর্ণ?
হুবার্ট গ্রাজেসকুইয়াক

34

দীর্ঘ সংক্ষিপ্ত বিবরণ:

বাশে কোনও বুলিয়ান নেই

তুলনা এবং শর্তাবলী বাশ বুলিয়ান এক্সপ্রেশন আছে। এটি বলেছিল, আপনি বাশে যা ঘোষণা করতে এবং তুলনা করতে পারবেন তা হ'ল স্ট্রিং এবং সংখ্যা। এটাই.

যেখানেই আপনি দেখতে trueবা falseব্যাশ, এটা হয় একটি স্ট্রিং বা কমান্ড / builtin যা শুধুমাত্র তার প্রস্থান কোড জন্য ব্যবহার করা হয় না।

এই বাক্য গঠন ...

if true; then ...

মূলত ...

if COMMAND; then ...

যখনই কমান্ড আয় প্রস্থান কোড 0. শর্ত সত্য হয় trueএবং falseব্যাশ builtins এবং কখনও কখনও এছাড়াও স্বতন্ত্র প্রোগ্রাম কিছুই কিন্তু সংশ্লিষ্ট প্রস্থান কোড ফেরার কি আছে।

শর্তাধীন উপরে সমতুল্য:

COMMAND && ...

বর্গাকার বন্ধনী বা testকমান্ড ব্যবহার করার সময় , আপনি সেই কনস্ট্রাক্টের প্রস্থান কোডের উপর নির্ভর করেন। খেয়াল রাখতে হবে যে [ ]এবং [[ ]]এছাড়াও অন্য কোন মত শুধু কমান্ড / builtins হয়। তাই ...

if [[ 1 == 1 ]]; then echo yes; fi

অনুরূপ

if COMMAND; then echo yes; fi

এবং COMMANDএখানে[[ 1 == 1 ]]

if..then..fiকনস্ট্রাক্ট শুধু অন্বিত চিনি। আপনি সর্বদা একই প্রভাবের জন্য কেবল ডাবল এম্পারস্যান্ড দ্বারা পৃথক করা কমান্ডগুলি চালাতে পারেন:

[[ 1 == 1 ]] && echo yes

এই পরীক্ষামূলক কনস্ট্রাক্টগুলি ব্যবহার trueএবং ব্যবহার করার সময় falseআপনি কেবলমাত্র স্ট্রিং "true"বা "false"টেস্টিং কমান্ডে যাচ্ছেন। এখানে একটি উদাহরণ:

বিশ্বাস করুন বা না করুন তবে এই শর্তগুলি একই ফল দিচ্ছে :

if [[ false ]]; then ...
if [[ "false" ]]; then ...
if [[ true ]]; then ...
if [[ "true" ]]; then ...

টি এল; ডিআর; সর্বদা স্ট্রিং বা সংখ্যাগুলির সাথে তুলনা করুন

এই ভবিষ্যতে পাঠকদের কাছে স্পষ্ট করার জন্য, আমি সবসময় কাছাকাছি কোট ব্যবহার সুপারিশ করবে trueএবং false:

আপনি কি

if [[ "${var}" == "true" ]]; then ...
if [[ "${var}" == "false" ]]; then ...
if [[ -n "${var:-}" ]]; then echo "var is not empty" ...

না

if [ ... ]; then ...  # Always use double square brackets in bash!
if [[ "${var}" ]]; then ...  # This is not as clear or searchable as -n
if [[ "${var}" != true ]]; then ...  # Creates impression of Booleans
if [[ "${var}" -eq "true" ]]; then ...  # `-eq` is for numbers and doesn't read as easy as `==`

হতে পারে

if [[ "${var}" != "true" ]]; then ...  # Creates impression of Booleans. It can be used for strict checking of dangerous operations. This condition is false for anything but the literal string "true".

আমি ব্যবহার করতে পছন্দ Tএবং Fপরিষ্কার বর্ণনা করে দিতে সেই বাস্তব বুলিয়ান মান নয়।
পিএইচকে

1
আমি "বশে সর্বদা ডাবল বন্ধনী ব্যবহার করি" এর সাথে একমত হতে পারি না। প্রকৃতপক্ষে আমি লিখিত প্রায় সমস্ত স্ক্রিপ্টগুলিতে আমি একক বন্ধনী ব্যবহার করছি, প্যাটার্ন ম্যাচিংয়ের দরকার পরে। আমি মনে করি যে একজনের [(যেমন test) এর মধ্যে পার্থক্য বুঝতে হবে এবং [[তার প্রয়োজনের জন্য উপযুক্ত এটি ব্যবহার করা উচিত।
ওয়েইজুন চিউ

@ ওয়েইজুনঝু আপনি কীভাবে একক বন্ধনী আরও ভাল?
হুবার্ট গ্রেজস্কোয়িয়াক

এটি আরও ব্যক্তিগত স্বাদযুক্ত, আমি কেবল এটি দেখতে "এটি সবসময় ব্যাশে ডাবল বর্গাকার বন্ধনী ব্যবহার করুন" বলাই বাহুল্য বলে মনে করি। তবে কিছু কিনারার কেস রয়েছে যা আমি ব্যবহার করেছি। একক বন্ধনীর সাহায্যে পরীক্ষাটি নিজেই কোনও ভারে নির্দিষ্ট করা যায়। ওভারসিম্প্লিফাইফাইড উদাহরণ হিসাবে বিবেচনা করুনif ....; then mytest='-gt'; else mytest='-eq'; fi; #several lines of code; if [ "$var1" "$mytest" "$var2" ]; then ...; fi
ওয়েইজুন চৈউ

@ ওয়েইজুনঝৌ আপনার উদাহরণটি একক বর্গাকার বন্ধনীগুলির বিরুদ্ধে একটি শক্ত যুক্তি। কোডটি বোঝা আরও শক্ত করে তোলে এবং ত্রুটিগুলির জন্য উইন্ডোটি প্রশস্ত করে খোলে। ডাবল বন্ধনী আরও কঠোর এবং ক্লিনার কোডকে উত্সাহ দেয়।
হুবার্ট গ্রেজস্কোয়িয়াক

18

অনেক আগে, যখন আমরা যা ছিলাম sh, বুলিয়ানরা যেখানে কোনও আর্গুমেন্ট ছাড়াই চালিত হলে একটি মিথ্যা প্রস্থান স্থিতি করে এমন একটি testপ্রোগ্রামের কনভেনশনের উপর নির্ভর করে পরিচালিত হয়েছিল test

এটি একটিকে এমন ভেরিয়েবলের কথা চিন্তা করতে দেয় যা কোনও মান হিসাবে মিথ্যা এবং ভেরিয়েবল সেট হিসাবে সত্য হিসাবে সেট না করে is আজ, testবাশের কাছে একটি অন্তর্নির্মিত এবং এটি সাধারণত তার এক-চরিত্রের উপনাম দ্বারা পরিচিত [(বা এটি অভাবী শেলগুলিতে ডলম্যান নোট হিসাবে ব্যবহারের জন্য কার্যকর):

FLAG="up or <set>"

if [ "$FLAG" ] ; then
    echo 'Is true'
else
    echo 'Is false'
fi

# Unset FLAG
#    also works
FLAG=

if [ "$FLAG" ] ; then
    echo 'Continues true'
else
    echo 'Turned false'
fi

কনভেনশন উদ্ধৃতি দেওয়ার কারণে, স্ক্রিপ্ট লেখকরা যৌগিক আদেশটি [[নকল করতে পছন্দ করে testতবে তার একটি সুন্দর সিনট্যাক্স থাকে: স্পেস সহ ভেরিয়েবলগুলি উদ্ধৃত করার প্রয়োজন হয় না; এক অদ্ভুত অগ্রাধিকার সহ লজিকাল অপারেটর হিসাবে ব্যবহার করতে পারেন &&এবং ||পদগুলির সংখ্যাতে কোনও পসিক্স সীমাবদ্ধতা নেই।

উদাহরণস্বরূপ, FLAG সেট করা আছে কিনা তা নির্ধারণ করতে এবং COUNT টি 1 এর চেয়ে বড় সংখ্যা:

FLAG="u p"
COUNT=3

if [[ $FLAG  && $COUNT -gt '1' ]] ; then
    echo 'Flag up, count bigger than 1'
else
    echo 'Nope'
fi

শূন্যস্থান, শূন্য দৈর্ঘ্যের স্ট্রিং এবং নাল ভেরিয়েবলগুলি যখন প্রয়োজন হয় এবং যখন আপনার স্ক্রিপ্টটিকে বেশ কয়েকটি শেল দিয়ে কাজ করা দরকার হয় তখন এই জিনিসগুলি বিভ্রান্ত হয়ে উঠতে পারে।


3
[শুধু ভিতরে একটি উপনাম নয় bash। এই উয়ার্সটি বাইনারি ফাইল হিসাবে উপস্থিত রয়েছে (বা একটি লিঙ্ক হিসাবে নির্দেশ করছে) এবং খালি দিয়ে ব্যবহার করা যেতে পারে sh। চেক ls -l /usr/bin/\[। এর পরিবর্তে bash/ zshআপনার পরিবর্তে এটি ব্যবহার করা উচিত [[যা সত্য খাঁটি অভ্যন্তরীণ এবং আরও শক্তিশালী।
ডলম্যান

1
@ ডলম্যান [এবং testবাশ ম্যানুয়াল পৃষ্ঠা অনুসারে বাশ শেল বিল্টিন কম্যান্ডও রয়েছে, সুতরাং পারফরম্যান্সে কোনও সমস্যা হওয়া উচিত নয়। উদাহরণস্বরূপ ড্যাশ সহ একই জিনিস। (/ বিন / শ কেবলমাত্র / বিন / ড্যাশের সাথে একটি সিমলিংক থাকতে পারে)। এক্সিকিউটেবলকে ব্যবহার করতে আপনাকে পুরো পাথ ব্যবহার করতে হবে /usr/bin/\[
জার্নো

12

আমি কীভাবে শেল স্ক্রিপ্টে বুলিয়ান ভেরিয়েবলগুলি ঘোষণা করতে এবং ব্যবহার করতে পারি?

অন্যান্য অনেক প্রোগ্রামিং ভাষার মতো নয়, বাশ তার ভেরিয়েবলগুলি "প্রকার" দ্বারা আলাদা করে না। [1]

সুতরাং উত্তর বেশ পরিষ্কার। বাশে কোনও বুলিয়ান ভেরিয়েবল নেই

যাহোক:

একটি ডিক্লেয়ার স্টেটমেন্ট ব্যবহার করে আমরা ভেরিয়েবলের মধ্যে ভ্যালু অ্যাসাইনমেন্ট সীমাবদ্ধ করতে পারি। [2]

#!/bin/bash
declare -ir BOOL=(0 1) # Remember BOOL can't be unset till this shell terminates
readonly false=${BOOL[0]}
readonly true=${BOOL[1]}

# Same as declare -ir false=0 true=1
((true)) && echo "True"
((false)) && echo "False"
((!true)) && echo "Not True"
((!false)) && echo "Not false"

rবিকল্প declareএবং readonlyরাষ্ট্র করতে ব্যবহৃত হয় স্পষ্টভাবে ভেরিয়েবল কেবল পঠনযোগ্য । আমি আশা করি উদ্দেশ্যটি পরিষ্কার।


1
তুমি শুধু করছ না কেন declare -ir false=0 true=1? অ্যারে ব্যবহার করে কী সুবিধা?
বেঞ্জামিন ডব্লিউ।

@BenjaminW। আমি কেবল rবিকল্প এবং readonlyকমান্ড সম্পর্কে উল্লেখ করতে চেয়েছিলাম । আপনি আমার স্ক্রিপ্টগুলিতে যেভাবে পরামর্শ দিয়েছেন তা আমি করব
sjsam

হয়তো আমি কিছু মিস করেছি তবে কেন ডলার চিহ্ন ব্যবহার করে সত্য এবং মিথ্যা ঘোষিত হবে না? সত্য $ মিথ্যা
কোডেনিনজা

আক্ষরিকভাবে আমার উত্তরটি অনুলিপি করে আরও খারাপ করে তুলছে।
কোলোনেল প্রশ্নগুলি

@ কলোনেলকিউশনস বাশ ভেরিয়েবল টাইপ করা হয় না , তাই বলার অপেক্ষা রাখে না। declare and use boolean variablesআমরা একাধিক উপায়ে নকল / ধরে নিতে পারি যে ভেরিয়েবলের একটি প্রকার রয়েছে । আমি আপনার উত্তরে কোথাও উল্লেখ করা হয়নি।
sjsam

10

বুলিয়ান ফেক করার পরিবর্তে এবং ভবিষ্যতের পাঠকদের জন্য একটি ফাঁদ রেখে, কেন কেবল সত্য এবং মিথ্যা অপেক্ষা ভাল মান ব্যবহার করা হচ্ছে না?

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

build_state=success
if something-horrible; then
  build_state=failed
fi

if [[ "$build_state" == success ]]; then
  echo go home; you are done
else
  echo your head is on fire; run around in circles
fi

পূর্ণসংখ্যা কেন হয় না?
ফিলি 294

3
@ ব্লাউহিরন কারণ ভাষার উপর নির্ভর করে পূর্ণসংখ্যা বিভিন্নভাবে ব্যবহৃত হয়। কিছু ভাষায় 0করতে coerces falseএবং 1করতে true। প্রোগ্রামের প্রস্থান কোডগুলির ক্ষেত্রে (যা বাশ historতিহাসিকভাবে ব্যবহার করে) এটি 0ইতিবাচক ফলাফলের জন্য বা trueঅন্য সব কিছু নেতিবাচক / ত্রুটি বা false
হুবার্ট গ্রাজেসকুইক

7

পসিক্স (পোর্টেবল অপারেটিং সিস্টেম ইন্টারফেস)

আমি এখানে মূল পয়েন্টটি মিস করছি, যা বহনযোগ্যতা। সে কারণেই আমার শিরোনামের নিজের মধ্যে পসিক্স রয়েছে।

মূলত, ভোট উত্তর সমস্ত সঠিক হয়, ব্যতিক্রম তারা সঙ্গে ব্যাশ -specific অত্যধিক।

মূলত, আমি কেবল বহনযোগ্যতা সম্পর্কে আরও তথ্য যুক্ত করতে চাই।


  1. [এবং এর ]মতো বন্ধনীগুলি [ "$var" = true ]প্রয়োজনীয় নয় এবং আপনি সেগুলি বাদ দিতে পারেন এবং testসরাসরি আদেশটি ব্যবহার করতে পারেন :

    test "$var" = true && yourCodeIfTrue || yourCodeIfFalse

    গুরুত্বপূর্ণ দ্রষ্টব্য: আমি এটির আর সুপারিশ করব না কারণ এটি ধীরে ধীরে হ্রাস করা হচ্ছে এবং একাধিক বক্তব্য একত্রিত করা আরও বেশি কঠিন।

  2. এই শব্দগুলি trueএবং falseশেলটির অর্থ কী তা কল্পনা করুন , নিজে এটি পরীক্ষা করুন:

    echo $(( true ))
    0
    echo $(( false ))
    1

    তবে উদ্ধৃতি ব্যবহার:

    echo $(( "true" ))
    bash: "true": syntax error: operand expected (error token is ""true"")
    sh (dash): sh: 1: arithmetic expression: expecting primary: ""true""

    একই জন্য:

    echo $(( "false" ))

    শেল এটি একটি স্ট্রিং ছাড়া অন্য ব্যাখ্যা করতে পারে না। আমি আশা করি আপনি উদ্ধৃতি ছাড়াই সঠিক কীওয়ার্ডটি ব্যবহার করছেন এটি কতটা ভাল ধারণা পেয়ে যাবেন

    তবে পূর্বের উত্তরে কেউ তা বলেনি।

  3. এটার মানে কি? ভাল, বেশ কিছু জিনিস।

    • আপনার বুলিয়ান কীওয়ার্ডগুলিতে অভ্যস্ত হওয়া উচিত প্রকৃতপক্ষে সংখ্যার মতো চিকিত্সা করা উচিত, এটি true= 0এবং false= 1, মনে রাখবেন যে সমস্ত শূন্য-মানগুলি একইরকম আচরণ করা হয় false

    • যেহেতু তাদেরকে সংখ্যা হিসাবে বিবেচনা করা হয়, আপনার তাদের সাথেও এটির মতো আচরণ করা উচিত, যদি আপনি ভেরিয়েবলটি সংজ্ঞায়িত করেন:

      var_bool=true
      echo "$var_bool"
       true

      আপনি এটির সাথে একটি বিপরীত মান তৈরি করতে পারেন:

      var_bool=$(( 1 - $var_bool ))  # same as $(( ! $var_bool ))
      echo "$var_bool"
      1

    আপনি নিজেরাই দেখতে পাচ্ছেন, শেলটি trueআপনি প্রথমবার ব্যবহার করার জন্য মুদ্রণ স্ট্রিংটি ব্যবহার করেন তবে তার পর থেকে এটি যথাক্রমে 0প্রতিনিধিত্বকারী trueবা 1প্রতিনিধিত্বকারী সংখ্যার মাধ্যমে কাজ falseকরে।


অবশেষে, সমস্ত তথ্য দিয়ে আপনার কী করা উচিত

  • প্রথমত, একটি ভাল অভ্যাস 0পরিবর্তে বরাদ্দ করা হবে true; 1পরিবর্তে false

  • দ্বিতীয় ভাল অভ্যাসটি পরীক্ষা করা হবে যদি ভেরিয়েবলটি শূন্যের সমান / না হয়:

    if [ "$var_bool" -eq 0 ]; then
         yourCodeIfTrue
    else
         yourCodeIfFalse
    fi

6

সিনট্যাক্স সম্পর্কিত, এটি একটি সহজ পদ্ধতি যা আমি বুলিয়ান যুক্তির ধারাবাহিকতা এবং বুদ্ধিমানভাবে পরিচালনা করতে ব্যবহার করি (উদাহরণস্বরূপ):

# Tests
var=
var=''
var=""
var=0
var=1
var="abc"
var=abc

if [[ -n "${var}" ]] ; then
    echo 'true'
fi
if [[ -z "${var}" ]] ; then
    echo 'false'
fi

# Results
# var=        # false
# var=''      # false
# var=""      # false
# var=0       # true
# var=1       # true
# var="abc"   # true
# var=abc     # true

যদি চলকটি কখনই ঘোষণা না করা হয় তবে উত্তরটি হ'ল: # false

সুতরাং, ভেরিয়েবলটিকে সত্যে সেট করার একটি সহজ উপায় (এই সিনট্যাক্স পদ্ধতিটি ব্যবহার করে) হবে var=1; বিপরীতভাবে var='',।

রেফারেন্স:

-n = সত্য যদি ভার স্ট্রিংয়ের দৈর্ঘ্য শূন্য হয় না।

-z = সত্য যদি ভার স্ট্রিংয়ের দৈর্ঘ্য শূন্য হয়।


5

অনেক প্রোগ্রামিং ভাষায়, বুলিয়ান টাইপটি পূর্ণসংখ্যার একটি সাব টাইপ, বা হিসাবে প্রয়োগ করা হয়, যেখানে এর trueমতো আচরণ করে 1এবং falseআচরণ করে 0:

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

# val=1; ((val)) && echo "true" || echo "false"
true
# val=0; ((val)) && echo "true" || echo "false"
false

ম্যান বাশ :

((অভিব্যক্তি))

অভিব্যক্তি মূল্যায়ন মূল্যায়নের অধীনে বর্ণিত নিয়ম অনুসারে মূল্যায়ন করা হয়। যদি অভিব্যক্তির মান শূন্য-না হয়, ফেরতের স্থিতি 0 হয়; অন্যথায় রিটার্নের স্থিতি ১। এটি "এক্সপ্রেশন" হিসাবে ঠিক সমান।


5

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

বাশ সিঙ্গেল বন্ধনীগুলির পরিবর্তে এখন অভ্যাস হিসাবে ডাবল বন্ধনী ব্যবহারের পরামর্শ দেয় এবং মাইক হল্ট লিঙ্কটি তারা কীভাবে কাজ করে তার পার্থক্য ব্যাখ্যা করে। 7.3। অন্যান্য তুলনা অপারেটর

একটি জিনিস জন্য, -eqএকটি সংখ্যার অপারেটর, তাই কোড আছে

#**** NOTE *** This gives error message *****
The_world_is_flat=0;
if [ "${The_world_is_flat}" -eq true ]; then

একটি পূর্ণসংখ্যার এক্সপ্রেশন আশা করে একটি ত্রুটি বিবৃতি জারি করবে। এটি উভয়ই প্যারামিটারে প্রযোজ্য, কারণ কোনওটিই পূর্ণসংখ্যার মান নয়। তবুও, আমরা যদি এটির চারপাশে ডাবল বন্ধনী রাখি, তবে এটি ত্রুটি বিবৃতি জারি করবে না, তবে এটির একটি ভুল মান হবে (ভাল, সম্ভাব্য ক্রমের 50% ক্ষেত্রে)। এটি [[0 -eq সত্য]] = সাফল্যের সাথে মূল্যায়ন করবে, তবে [[0 -eq মিথ্যা]] = সাফল্যও যা ভুল (হুম্ম .... .... এই বিল্টিনটি একটি সংখ্যাসূচক মান হিসাবে কী হবে?)।

#**** NOTE *** This gives wrong output *****
The_world_is_flat=true;
if [[ "${The_world_is_flat}" -eq true ]]; then

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

# With variable set as an integer and evaluating to true/false
# *** This will issue error warning and not run: *****
The_world_is_flat=0;
if [ "${The_world_is_flat}" -eq true ]; then

# With variable set as an integer and evaluating to true/false
# *** These statements will not evaluate properly: *****
The_world_is_flat=0;
if [ "${The_world_is_flat}" -eq true ]; then
#
if [[ "${The_world_is_flat}" -eq true ]]; then
#
if [ "${The_world_is_flat}" = true ]; then
#
if [[ "${The_world_is_flat}" = true ]]; then
#
if [ "${The_world_is_flat}" == true ]; then
#
if [[ "${The_world_is_flat}" == true ]]; then


# With variable set as an true/false builtin and evaluating to true/false
# *** These statements will not evaluate properly: *****
The_world_is_flat=true;
if [[ "${The_world_is_flat}" -eq true ]]; then
#
if [ "${The_world_is_flat}" = 0 ]; then
#
if [[ "${The_world_is_flat}" = 0 ]]; then
#
if [ "${The_world_is_flat}" == 0 ]; then
#
if [[ "${The_world_is_flat}" == 0 ]]; then

সুতরাং, এখন কি কাজ করে। আপনার তুলনা এবং আপনার মূল্যায়ন উভয়ের জন্য সত্য / মিথ্যা বিল্টিনগুলি ব্যবহার করুন (মাইক হান্ট যেমন উল্লেখ করেছেন, সেগুলিকে উদ্ধৃতিতে আবদ্ধ করবেন না)। তারপরে একটি বা একক বা ডাবল সমান চিহ্ন (= বা ==) এবং একক বা ডাবল বন্ধনী ([]] বা [[]]) ব্যবহার করুন। ব্যক্তিগতভাবে, আমি দ্বিগুণ সমান চিহ্নটি পছন্দ করি, কারণ এটি অন্যান্য প্রোগ্রামিং ভাষাগুলিতে লজিক্যাল তুলনাগুলি এবং আমার কাছে টাইপিং পছন্দ করার কারণে ডাবল উদ্ধৃতিগুলি মনে করিয়ে দেয়। সুতরাং এই কাজ:

# With variable set as an integer and evaluating to true/false
# *** These statements will work properly: *****
#
The_world_is_flat=true/false;
if [ "${The_world_is_flat}" = true ]; then
#
if [[ "${The_world_is_flat}" = true ]]; then
#
if [ "${The_world_is_flat}" = true ]; then
#
if [[ "${The_world_is_flat}" == true ]]; then

ওখানে তোমার আছে।


2
এখানে true/ falseবিল্ট-ইনগুলি ব্যবহার করা হয়নি (কিছু সম্পাদকের সিনট্যাক্স হাইলাইটিং কী বোঝাতে পারে তা উপেক্ষা করুন), বিশেষত […]ক্ষেত্রে আপনি এটিকে এখানে সরল স্ট্রিং হিসাবে ভাবতে পারেন ( [কমান্ডের প্যারামিটার হিসাবে দেওয়া হয়েছে )।
পিএইচকে

আপনার এখন এটি আছে।
পিটার মর্টেনসেন

4

আমার অনুসন্ধান এবং পরামর্শ অন্যান্য পোস্টের চেয়ে কিছুটা আলাদা। আমি দেখতে পেয়েছি যে আমি "বুলিয়ানস "টি মূলত যে কোনও" নিয়মিত "ভাষায় ব্যবহার করতে পারতাম," হুপ জাম্পিং "ছাড়াই পরামর্শ দেওয়া হয়েছিল ...

[]সুস্পষ্ট স্ট্রিং তুলনার জন্য প্রয়োজন নেই ... আমি একাধিক লিনাক্স বিতরণ চেষ্টা করেছি। আমি বাশ, ড্যাশ এবং ব্যাসিবক্স পরীক্ষা করেছি । ফলাফল সবসময় একই ছিল। আসল শীর্ষে পোষ্ট হওয়া পোস্টগুলি কী সম্পর্কে কথা বলছে তা আমি নিশ্চিত নই। হয়তো সময় বদলেছে এবং এর সব কি আছে?

আপনি যদি কোনও ভেরিয়েবল সেট করে থাকেন তবে trueএটি পরবর্তীতে শর্তাধীন একটি "affirmative" হিসাবে মূল্যায়ন করে। এটিতে সেট করুন falseএবং এটি একটি "নেতিবাচক" এর জন্য মূল্যায়ন করে। খুব সোজা! একমাত্র সতর্কবাণী, একটি অনির্ধারিত পরিবর্তনশীলও সত্যের মতো মূল্যায়ন করে ! এটি বিপরীত হয়ে থাকলে এটি বেশ ভাল হবে (এটি বেশিরভাগ ভাষায় যেমন হবে) তবে এটি কৌশলটি - আপনার স্পষ্টভাবে আপনার বুলিয়ানগুলি সত্য বা মিথ্যা হিসাবে সূচনা করতে হবে

কেন এটি এভাবে কাজ করে? এই উত্তর দুটি ভাঁজ। ক) শেলটিতে সত্য / মিথ্যা বলতে আসলে "ত্রুটি নেই" বনাম "ত্রুটি" (যেমন 0 অন্য কোনও কিছু নয়)। খ) সত্য / মিথ্যা মান নয় - বরং শেল স্ক্রিপ্টিং-এ বিবৃতি ! দ্বিতীয় দফার বিষয়ে, কার্যকর করা trueবা falseনিজেই একটি লাইনে আপনি যে মানটির মধ্যে falseরয়েছেন সেই ব্লকের জন্য রিটার্ন মান নির্ধারণ করে, অর্থাত্ "ত্রুটির মুখোমুখি" হ'ল একটি ঘোষণা, যেখানে সত্য "ক্লিয়ার" হয়। একটি ভেরিয়েবলের জন্য একটি অ্যাসাইনমেন্ট সহ এটি ব্যবহার করে "রিটার্ন" ভেরিয়েবলের মধ্যে। একটি অপরিজ্ঞাত পরিবর্তনশীল trueশর্তাধীন এর মতো মূল্যায়ন করে কারণ এটি সমান 0 বা "কোনও ত্রুটির মুখোমুখি হয় না" উপস্থাপন করে।

নীচে বাশ লাইনগুলি এবং ফলাফলগুলি দেখুন। আপনি যদি নিশ্চিত করতে চান তবে এটি নিজে পরীক্ষা করুন ...

#!/bin/sh

# Not yet defined...
echo "when set to ${myBool}"
if ${myBool}; then echo "it evaluates to true"; else echo "it evaluates to false"; fi;

myBool=true
echo "when set to ${myBool}"
if ${myBool}; then echo "it evaluates to true"; else echo "it evaluates to false"; fi;

myBool=false
echo "when set to ${myBool}"
if ${myBool}; then echo "it evaluates to true"; else echo "it evaluates to false"; fi;

উৎপাদনের

when set to
it evaluates to true
when set to true
it evaluates to true
when set to false
it evaluates to false


1

এখানে একটি সংক্ষিপ্ত হাতে একটি বাস্তবায়ন if true

# Function to test if a variable is set to "true"
_if () {
    [ "${1}" == "true" ] && return 0
    [ "${1}" == "True" ] && return 0
    [ "${1}" == "Yes" ] && return 0
    return 1
}

উদাহরণ 1

my_boolean=true

_if ${my_boolean} && {
    echo "True Is True"
} || {
    echo "False Is False"
}

উদাহরণ 2

my_boolean=false
! _if ${my_boolean} && echo "Not True is True"

হ্যাঁ, কার্যকরী ক্ষয়টি প্রশংসিত হয়।
পিটার মর্টেনসেন

1

আমি বিদ্যমান উত্তরগুলি গুলিয়ে ফেললাম।

ব্যক্তিগতভাবে, আমি কেবল এমন কিছু পেতে চাই যা দেখতে সি এর মতো দেখায় এবং কাজ করে

এই স্নিপেট উত্পাদনে দিনে বহুবার কাজ করে:

snapshotEvents=true

if ($snapshotEvents)
then
    # Do stuff if true
fi

এবং সবাইকে খুশি রাখতে, আমি পরীক্ষা করেছি:

snapshotEvents=false

if !($snapshotEvents)
then
    # Do stuff if false
fi

যা ভাল কাজ করেছে।

$snapshotEventsভেরিয়েবলের মান বিষয়বস্তু মূল্যায়ন করে। সুতরাং আপনি প্রয়োজন $

আপনার সত্যিকারের প্রথম বন্ধনীগুলির দরকার নেই, আমি কেবল তাদের সহায়ক মনে করি।


2
আপনি যেখানে প্রথম বন্ধনী সরিয়েছেন, এটি ঠিক উপরে @ মিকুর মূল উত্তর।
ডলমেন

1
বন্ধনী ছাড়া অভিব্যক্তি মূল্যায়ন করে না।
হবে

@ হ্যাঁ এটা করবে। আপনার (গুলি) দরকার নেই।
phil294

1
@ ব্লাউহিরন ... হাই, আমি জিএনইউ বাশের সাথে লিনাক্স মিন্ট / উবুন্টু পিসিতে পরীক্ষাগুলির উপর ভিত্তি করেছিলাম। আপনার সম্ভবত তত্ত্বের ক্ষেত্রে সঠিক ()- প্রয়োজন নেই। আমার একমাত্র প্রতিক্রিয়া, এটি চেষ্টা করে দেখুন, এটি ব্যাশ সংস্করণ, আসল প্রকাশ বা প্রসঙ্গ এবং এর উপর নির্ভর করে।
হবে

1

এখানে মিকুর মূল উত্তরের একটি উন্নতি দেওয়া হয়েছে যা ভেরিয়েবলটি সেট করা হয়নি এমন ক্ষেত্রে ডেনিস উইলিয়ামসনের উদ্বেগকে সম্বোধন করে:

the_world_is_flat=true

if ${the_world_is_flat:-false} ; then
    echo "Be careful not to fall off!"
fi

ভেরিয়েবল কিনা তা পরীক্ষা করার জন্য false:

if ! ${the_world_is_flat:-false} ; then
    echo "Be careful not to fall off!"
fi

ভেরিয়েবলের কোনও কদর্য কন্টেন্ট সহ অন্যান্য ক্ষেত্রে, এটি কোনও প্রোগ্রামকে খাওয়ানো কোনও বাহ্যিক ইনপুট নিয়ে সমস্যা।

যে কোনও বাহ্যিক ইনপুটটিকে বিশ্বাস করার আগে অবশ্যই বৈধ হওয়া উচিত। তবে সেই বৈধতাটি একবারে করতে হবে, যখন সেই ইনপুটটি পাওয়া যায়।

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


1

আপনি shFlags ব্যবহার করতে পারেন ।

এটি আপনাকে সংজ্ঞা দেওয়ার বিকল্প দেয়: DEFINE_bool

উদাহরণ:

DEFINE_bool(big_menu, true, "Include 'advanced' options in the menu listing");

কমান্ড লাইন থেকে আপনি সংজ্ঞা দিতে পারেন:

sh script.sh --bigmenu
sh script.sh --nobigmenu # False

জিএফ্ল্যাগগুলি এই উত্তরের কোনও অর্থ দেয় না - এটি একটি সি ++ গ্রন্থাগার। এটি শেল স্ক্রিপ্টগুলিতে সরাসরি ব্যবহার করা যায় না।
জোনাথন ক্রস

ShFlags- এ আপডেট হওয়া প্রতিক্রিয়া যা শেল থেকে GFlags এর বন্দর।
গোগাসকা

0

এটি বাশ-এর ​​"বুলিয়ান" মানগুলি পরীক্ষা করার বিভিন্ন উপায় সম্পর্কে একটি গতি পরীক্ষা:

#!/bin/bash
rounds=100000

b=true # For true; b=false for false
type -a true
time for i in $(seq $rounds); do command $b; done
time for i in $(seq $rounds); do $b; done
time for i in $(seq $rounds); do [ "$b" == true ]; done
time for i in $(seq $rounds); do test "$b" == true; done
time for i in $(seq $rounds); do [[ $b == true ]]; done

b=x; # Or any non-null string for true; b='' for false
time for i in $(seq $rounds); do [ "$b" ]; done
time for i in $(seq $rounds); do [[ $b ]]; done

b=1 # Or any non-zero integer for true; b=0 for false
time for i in $(seq $rounds); do ((b)); done

এটি কিছু মুদ্রণ হবে

true is a shell builtin
true is /bin/true

real    0m0,815s
user    0m0,767s
sys     0m0,029s

real    0m0,562s
user    0m0,509s
sys     0m0,022s

real    0m0,829s
user    0m0,782s
sys     0m0,008s

real    0m0,782s
user    0m0,730s
sys     0m0,015s

real    0m0,402s
user    0m0,391s
sys     0m0,006s

real    0m0,668s
user    0m0,633s
sys     0m0,008s

real    0m0,344s
user    0m0,311s
sys     0m0,016s

real    0m0,367s
user    0m0,347s
sys     0m0,017s

-2

বিকল্প - একটি ফাংশন ব্যবহার করুন

is_ok(){ :;}
is_ok(){ return 1;}
is_ok && echo "It's OK" || echo "Something's wrong"

ফাংশনটি সংজ্ঞায়িত করা কম স্বজ্ঞাত, তবে এর রিটার্নের মানটি পরীক্ষা করা খুব সহজ।


1
এটি কোনও পরিবর্তনশীল নয় যা আপনি পরীক্ষা করতে পারেন, তবে একটি ধ্রুবক ক্রিয়াকলাপ
জার্নো

@ জার্নো কোনও স্ক্রিপ্টের উদ্দেশ্যে, কোনও ভেরিয়েবলের পরীক্ষা করা থেকে কোনও ফাংশনের রিটার্নের মান পরীক্ষা করা কি আলাদা?
জনহরফ

ঠিক আছে, প্রশ্নটি ভেরিয়েবল সম্পর্কে।
জার্নো

সত্য, যদিও শেল স্ক্রিপ্টে ব্যবহার একই হবে।
জনহরফ

-2

ব্যাশ সত্যিই এর পছন্দ সঙ্গে সমস্যা বিভ্রান্ত [, [[, ((,$(( , ইত্যাদি

একে অপরের কোড স্পেসে সমস্ত চলমান। আমার ধারণা এটি বেশিরভাগ historicalতিহাসিক, যেখানে বাশকে ভান করতে হয়েছিলsh মাঝে মাঝে ।

বেশিরভাগ সময়, আমি কেবল একটি পদ্ধতি বাছাই করতে এবং এটির সাথে আটকে রাখতে পারি। এই উদাহরণে, আমি ঘোষণার প্রবণতা করি (আমার সাধারণ লাইব্রেরী ফাইলে আমি .আমার আসল স্ক্রিপ্টের মধ্যে অন্তর্ভুক্ত করতে পারি)।

TRUE=1; FALSE=0

আমি এরপরে ((... ))পরীক্ষা করে গাণিতিক অপারেটরটি ব্যবহার করতে পারি ।

testvar=$FALSE

if [[ -d ${does_directory_exist} ]]
then
    testvar=$TRUE;
fi

if (( testvar == TRUE )); then
    # Do stuff because the directory does exist
fi
  1. আপনাকে শৃঙ্খলাবদ্ধ হতে হবে। আপনার testvarহয় হয় $TRUEবা সর্বদা সেট করা উচিত $FALSE

  2. ইন ((... ))comparators, আপনি পূর্ববর্তী প্রয়োজন হবে না $, যা এটি আরো পাঠযোগ্য হয়ে ওঠে।

  3. আমি ব্যবহার করতে পারি ((... ))কারণ $TRUE=1এবং $FALSE=0, যেমন সংখ্যাসূচক মান।

  4. ডাউনসাইডটি $মাঝে মাঝে ব্যবহার করতে হয় :

    testvar=$TRUE

    যা এত সুন্দর নয়।

এটি একটি নিখুঁত সমাধান নয়, তবে এটি এমন পরীক্ষার জন্য আমার প্রয়োজন প্রতিটি কেসকে কভার করে।


2
আপনার ধ্রুবকগুলি কেবল পঠনযোগ্যভাবে ঘোষণা করা উচিত। এছাড়াও ভেরিয়েবলগুলি ব্যবহার করার সময় দয়া করে সর্বদা কোঁকড়ানো বন্ধনী ব্যবহার করুন। এটি একটি সম্মেলন প্রত্যেকের আইএমএইচওর সাথে লেগে থাকা উচিত। এই সমাধানটির বড় ক্ষতিটি হ'ল আপনি পরীক্ষার পতাকা বা স্ট্রিং তুলনার সাথে বীজগণিত প্রকাশটি মিশ্রিত করতে পারবেন না।
হুবার্ট গ্রেজস্কোইয়াক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.