bash - কিভাবে শেল স্ক্রিপ্টে বুলিয়ান ভেরিয়েবল ঘোষণা এবং ব্যবহার করবেন?




shell scripting (11)

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

অন্য অনেক প্রোগ্রামিং ভাষাগুলির বিপরীতে, বাশ তার প্রকরণগুলিকে "টাইপ" দ্বারা পৃথক করে না। [1]

তাই উত্তর বেশ স্পষ্ট। boolean variable মধ্যে কোন boolean variable আছে। যাহোক :

একটি ঘোষণা বিবৃতি ব্যবহার করে, আমরা ভেরিয়েবল মান মান নিয়োগ সীমাবদ্ধ করতে পারেন। [2]

#!/bin/bash
declare -ir BOOL=(0 1) #remember BOOL can't be unset till this shell terminate
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"

readonly এবং readonlyr বিকল্পটি স্পষ্টভাবে বর্ণনা করে যে ভেরিয়েবলগুলি কেবল পাঠযোগ্য । উদ্দেশ্য পরিষ্কার হয় আশা করি।

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

variable=$false

variable=$true

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

if [ $variable ]

if [ !$variable ]

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

আমি মূল পয়েন্ট এখানে মিস্, যা পোর্টেবিলিটি। তাই আমার হেডার নিজেই POSIX আছে।

মূলত, ভোট দেওয়া উত্তরগুলি সঠিক, ব্যতিক্রমগুলি BASH স্পেসিফিকেশন খুব বেশি।

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

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

    test "$var" = true && CodeIfTrue || CodeIfFalse
  2. কল্পনা করুন যে শব্দের truefalse কী বোঝায়, নিজের পরীক্ষা করুন:

    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_a=true
      echo "$var_a"
       true

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

      var_a=$((1 - $var_a))
      echo "$var_a"
      1

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

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

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

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

    test "$var" -eq 0 && CodeIfTrue || CodeIfFalse

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

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 কিন্তু নিচের সিনট্যাক্স আছে: স্পেসগুলির ভেরিয়েবলগুলি উদ্ধৃত করার দরকার নেই, কেউ ব্যবহার করতে পারে && || অদ্ভুত অগ্রাধিকার সঙ্গে লজিক্যাল অপারেটর হিসাবে, এবং পদ সংখ্যা উপর কোন POSIX সীমাবদ্ধতা আছে।

উদাহরণস্বরূপ, 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

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


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

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

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

মানুষ bash :

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

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


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

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

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

এখানে একটি সহজ উদাহরণ যা আমার জন্য কাজ করে:

temp1=true
temp2=false

if [ "$temp1" = true ] || [ "$temp2" = true ]
then
    echo "Do something." 
else
    echo "Do something else."
fi

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

#!/bin/bash

false=0
true=1

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

আউটপুট:

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


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

Bash মধ্যে কোন বুলিয়ান আছে

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

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

এই সিনট্যাক্স ...

if true; then ...

মূলত ...

if COMMAND; then ...

যখনই কমান্ডটি প্রস্থান কোডটি ফেরত দেয় তখন শর্তটি সত্য হয়। সত্য এবং মিথ্যাগুলি বাশ বিল্টিন এবং কখনও কখনও এমন একাধিক প্রোগ্রাম যা অনুরূপ প্রস্থান কোডটি ফেরত প্রদান করে না।

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

COMMAND && ...

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

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 প্রায় কোট ব্যবহার করে সুপারিশ করব:

DO

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. Can be used for strict checking of dangerous operations. This condition is false for anything but the literal string "true". 

ব্যাশের true সম্পর্কে এখানে কিছু ভুল ধারণা রয়েছে, এবং বিশেষ করে, ব্যাস কীভাবে ব্যাস বিস্তৃত করে এবং এক্সপ্রেশনগুলিকে ব্রেকেটের ভিতরে ব্যাখ্যা করে।

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

নিম্নলিখিত কোডটি মিকুর উত্তরের কোডটি কার্যকরীভাবে একই রকম:

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

এখানে শুধু পার্থক্য হচ্ছে যে চারটি অক্ষর তুলনা করা হচ্ছে 'y', 'e', ​​'a', এবং 'h' এর পরিবর্তে 't', 'r', 'u', এবং 'e'। এটাই. কোন কমান্ড বা ইয়েমেন নামে নির্মিত নাম আহ্বানের কোন প্রচেষ্টা নেই, বা সেখানে নেই (মিকুর উদাহরণে) বাশ যখন টোকেনটি true পার্সন করে তখন কোনও ধরণের বিশেষ পরিচালনা চলছে। এটা শুধু একটি স্ট্রিং, এবং যে একটি সম্পূর্ণরূপে নির্বিচারে এক।

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

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

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

এখানে প্রতিটি ক্ষেত্রে বস কি করছে:

কোন বন্ধনী:

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

বন্ধনী:

  1. স্ট্রিংটি "true" পরিবর্তনশীল $the_world_is_flat প্রসারিত করুন।
  2. এখন সম্পূর্ণরূপে প্রসারিত শর্তাধীন অভিব্যক্তিটি পার্স করুন, যা string1 = string2 ফর্ম। = অপারেটর ব্যাশ এর স্ট্রিং তুলনা অপারেটর। তাই ...
  3. "true" এবং "true" তে একটি স্ট্রিং তুলনা করুন।
  4. হ্যাঁ, দুটি স্ট্রিং একই ছিল, তাই শর্তাধীন মান সত্য।
  5. then বিবৃতি এর 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

আপডেট (2014-04-14) = এবং == মধ্যে পার্থক্য সম্পর্কিত মন্তব্যগুলিতে প্রশ্নের উত্তর দিতে: AFAIK, কোন পার্থক্য নেই। == অপারেটর = বাশের নির্দিষ্ট শব্দের নাম, এবং যতদূর আমি দেখেছি, তারা সব প্রসঙ্গে ঠিক একই কাজ করে।

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

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

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


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

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

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

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

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

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

শর্তাধীন অন্যান্য permutations যা পাশাপাশি ভুল আউটপুট দিতে হবে। মূলত, কিছু (উপরের তালিকাভুক্ত ত্রুটি শর্ত ব্যতীত) যা একটি সংখ্যাসূচক মানের জন্য একটি পরিবর্তনশীল নির্ধারণ করে এবং এটি সত্য / মিথ্যা অন্তর্নির্মিতের সাথে তুলনা করে, অথবা একটি পরিবর্তনশীলকে সত্য / মিথ্যা নির্মিততে সেট করে এবং এটি সংখ্যাসূচক মানের সাথে তুলনা করে। এছাড়াও, যে কোনও ভেরিয়েবল একটি সত্য / মিথ্যা -eq করে এবং -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

সেখানে আপনি আছে।


সংশোধিত উত্তর (ফেব্রুয়ারি 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://.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 ফেব্রুয়ারী, ২014 এর সংশোধনের আগে মন্তব্যগুলি শুধুমাত্র আসল উত্তরগুলির সাথে সম্পর্কিত, এবং সংশোধিত উত্তরগুলির সাথে সম্পর্কিত বেশিরভাগ মন্তব্য ভুল। উদাহরণস্বরূপ, ডেনিশ উইলিয়ামসনের মন্তব্য ২ জুন, ২010 তারিখে true বিচ্যুতির মন্তব্যটি কেবলমাত্র মূল উত্তরটি প্রয়োগ করে, সংশোধিত নয়।






sh