শেল স্ক্রিপ্টে বুলিয়ান মান উপস্থাপন করার জন্য সেরা অনুশীলন কী?


15

আমি জানি, যে এখানে বুলিয়ান মান আছে bash তবে আমি সেগুলি কোথাও ব্যবহার করতে দেখি না।

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

এটি অর্জনের সেরা অনুশীলনটি কী হবে?

  • একটি স্ট্রিং?

    drive_xyz_available=true
  • একটি সংখ্যা (সত্যের জন্য 0, মিথ্যাটির জন্য ≠ 0)?

    drive_xyz_available=0    # evaluates to true
  • একটি অনুষ্ঠান?

    drive_xyz_available() { 
        if available_magic; then 
                return 0 
        else 
                return 1 
        fi
    }

আমি প্রায়শই অবাক হয়েছি, অন্যান্য ব্যক্তিরা কী আশা করতে পারেন যারা র‌্যাপারটি ব্যবহার করতে চান। তারা কি বুলিয়ান মান, ভেরিয়েবলের মতো একটি কমান্ড বা কল করতে কোনও ফাংশন আশা করবে?

সুরক্ষা দৃষ্টিকোণ থেকে আমি মনে করি যে দ্বিতীয় বিকল্পটি সবচেয়ে নিরাপদ তবে আপনার অভিজ্ঞতাগুলি শুনতে আমি পছন্দ করব।


3
help true ; help false ; help exit
কস্টাস

3
@ কাস্টাস আপনি কি বিশদ বিবরণ করতে চান?
Minix

উত্তর:


2
bool(){ return "$((!${#1}))"; }

if bool "$var"
then : do true
else : do false

উপরের কাজ করার জন্য কেবল কোনও পরিবর্তনের পরিবর্তে কিছু স্থির করুন, যদিও [ -n "$var" ]এটি সংক্ষিপ্ত হবে, যদি এটি সুস্পষ্ট না হয়।

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

উপরেরটি !notতার প্রথম আর্গুমেন্টের লেনের বুলিয়ান মান প্রদান করে - যদি আর্গুমেন্ট 0 বাদে অন্য কোনও অক্ষর থাকে তবে এটি 0 প্রদান করে, অন্যথায়, কোনও অক্ষর না থাকলে, এটি ফিরে আসে 1 এটি একই পরীক্ষা যা আপনি [ -n "$var" ]মূলত সম্পাদন করতে পারেন , তবে এটি এটি নামক একটি সামান্য ফাংশন এ গুটিয়ে রাখে bool()

এটি সাধারণত ফ্ল্যাগ ভেরিয়েবল কীভাবে কাজ করে তা। উদাহরণ স্বরূপ:

[ -d "$dir" ] || dir=

যেখানে কোনও স্ক্রিপ্টের অন্যান্য অংশগুলির প্রয়োজনীয়তা মেটাতে কেবল কোনও মান সন্ধান করতে হবে $dir। এটি প্যারামিটার প্রতিস্থাপনের সাথে সম্পর্কিত বলেও কার্যকর হয় - খালি বা আনসেট না করে পূরণের জন্য প্যারামিটারগুলি ডিফল্ট মানগুলিতে প্রসারিত করা যেতে পারে তবে অন্যথায় প্রিসেট মান হিসাবে প্রসারিত হবে ...

for set in yes ''
do echo "${set:-unset or null}"
done

... যা মুদ্রণ করবে ...

yes
unset or null

অবশ্যই এর বিপরীতে করাও সম্ভব :+তবে এটি কেবল আপনাকে পূর্বনির্ধারিত ডিফল্ট বা কিছুই দিতে পারে না, যেখানে উপরের ফর্মটি আপনাকে একটি মান বা একটি ডিফল্ট মান দিতে পারে।

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


1
আমি মনে করি না আপনি আমার প্রশ্নের উত্তর দিচ্ছেন। আমি শুল স্ক্রিপ্টে কীভাবে বুলিয়ান ব্যবহার করতে পারি তা জিজ্ঞাসা করছি না, তবে কোন উপায়ে সবচেয়ে সাধারণ এবং এটি অন্য ব্যবহারকারীর দ্বারা প্রত্যাশিত। যদি আমার প্রশ্নটি অস্পষ্ট হয় তবে আমি এটি সম্পাদনা করে খুশি হব। আপনার উত্তরটি কী করবে তার জন্য একটি সংক্ষিপ্ত ব্যাখ্যাও দুর্দান্ত। ধন্যবাদ.
Minix

@ মিনিক্স এর চেয়ে ভাল?
মাইকজার্ভ

আমি সাধারণত বরাদ্দ করি trueবা falseকোনও ভেরিয়েবলকে, আপনি তা করতে পারেনif $variable; then ...
wurtel

@ উর্টেল - এটি ডিফল্টর উপর নির্ভর করে $IFS- এবং যদি ভেরির মানটিতে কোনও ধরণের ব্যবহারকারীর ইনপুট থাকতে পারে তবে শুভকামনাও রয়েছে। মানটি শুরু হওয়ার সাথে সাথে যদি অজানা না হয় তবে এটি পরীক্ষা করার দরকার নেই। if ${var:+":"} false; thenডাব্লু / বুলিয়ান নাল / নাল মানগুলিতে কাজ করার সময় আপনি আরও নিরাপদে করতে পারেন । তবে এটি খুব কমই কার্যকর[ -n "$var" ] &&
মাইকসার্ভ

যদি আমি আমার স্ক্রিপ্টটি শুরু করি variable=falseএবং তারপরে যেকোন শর্ত অনুসারে এটি সত্য করে রাখি (ঠিক যেমন আমি সিতে চলক ব্যবহার করার সময় চাইতাম) তবে তাতে কোনও সমস্যা নেই, যাইহোক যাইহোক, বিভিন্ন আইএফএসের মান এবং এলোমেলো পরিবর্তনশীল মানগুলি সম্পর্কে আপনার আবেশ কী ... ।
wurtel

4

ভিতরে bash যে পরিবর্তনশীল মূলত একটি স্ট্রিং (অথবা একটি অ্যারে অথবা একটি ফাংশন, কিন্তু নিয়মিত ভেরিয়েবল সম্পর্কে এখানে আসুন আলাপ)।

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

trueএবং falseপ্রোগ্রামগুলি (সাধারণত বিল্টিনগুলি দ্বারা ওভাররাইড করা) কেবল ব্যবহারযোগ্য ছোট প্রোগ্রাম যা কিছুই করে না - কিছুই না করে trueসফল হয় এবং 0 দিয়ে প্রস্থান করে, যখন falseকিছু না করার চেষ্টা করে এবং "ব্যর্থ" হয়, 1 দিয়ে বেরিয়ে যায়, অর্থহীন শোনায় তবে এটি স্ক্রিপ্টিংয়ের পক্ষে খুব কার্যকর।

চারপাশে কীভাবে সত্যবাদিতা পাস করা যায়, এটি আপনার উপর নির্ভর করে। সত্য এবং ব্যবহারের জন্য কেবল "y" বা "হ্যাঁ" ব্যবহার করা বেশ সাধারণ বিষয় if [ x"$variable" = x"yes" ](ডামি স্ট্রিং সংযোজন করা হয়েছে xকারণ যদি $variableএটি শূন্য দৈর্ঘ্যের হয় তবে এটি একটি বোগাস কমান্ড তৈরি if [ = "yes" ]করতে বাধা দেয় যা পার্স করে না)। এটি কেবল ফাঁকের জন্য খালি স্ট্রিং ব্যবহার করতে কার্যকর হতে পারে এবং [ -z "$variable ]এটি শূন্য দৈর্ঘ্যের (বা -nএটি ননজারো হওয়ার জন্য) পরীক্ষা করার জন্য ব্যবহার করতে পারে।

যাইহোক, এটিতে আসলে বুলিয়ান মানগুলি পাস করার প্রয়োজন খুব বিরল bash- এটি কেবল exitব্যর্থতার পক্ষে বা একটি কার্যকর ফলাফল (বা যদি কিছু ভুল হয়ে যায় তবে শূন্য, এবং খালি স্ট্রিংয়ের জন্য পরীক্ষা করা) পাওয়া আরও সাধারণ বিষয়, এবং বেশিরভাগ ক্ষেত্রেই এটি হতে পারে প্রস্থান স্থিতি থেকে সরাসরি ব্যর্থতার জন্য পরীক্ষা।


আপনার ক্ষেত্রে, আপনি এমন একটি ফাংশন চান যা অন্য কোনও কমান্ড হিসাবে কাজ করবে (অতএব, সাফল্যে 0 ফিরে আসবে), সুতরাং আপনার শেষ বিকল্পটি সঠিক পছন্দ বলে মনে হচ্ছে।

এছাড়াও, আপনার এমনকি returnবিবৃতি প্রয়োজন হতে পারে না । যদি ফাংশনটি যথেষ্ট সহজ হয় তবে আপনি এটি ব্যবহার করতে পারেন যে এটি কেবল ফাংশনে শেষ সম্পাদিত কমান্ডের স্থিতি ফিরিয়ে দেয়। সুতরাং আপনার ফাংশন সহজভাবে হতে পারে

drive_xyz_available() {
   [ -e /dev/disk/by-uuid/whatever ]
}

আপনি যদি কোনও ডিভাইস নোডের অস্তিত্বের /proc/mountsজন্য পরীক্ষা করে নিচ্ছেন (বা এটি মাউন্ট হয়েছে কিনা তা পরীক্ষা করার জন্য গ্রেপ )?


এটি একটি খুব সুন্দর সংক্ষিপ্তসার, এটি লিখে সময় দেওয়ার জন্য আপনাকে ধন্যবাদ। আমি কি আপনার শেষ অনুচ্ছেদ থেকে অনুমান করতে পারি, আপনি drive_xyz_available()সবচেয়ে সাধারণ হিসাবে বিকল্পটি বিবেচনা করবেন ?
Minix

আপনি সাধারণ y = trueক্ষেত্রে কিছু উদাহরণ প্রদান করতে পারেন ? আমার অভিজ্ঞতায়, বেশিরভাগ মোড়ক স্ক্রিপ্টগুলি একে সত্য বলে বিবেচনা করার জন্য কোনও নাল মানটির পরীক্ষা করে না - অন্তত যেখানে ব্যাখ্যা করা পরিবেশের পরিবর্তনশীলগুলি সম্পর্কিত। অন্যথায় তারা শেল গাড়ি পুরোপুরি উপেক্ষা করে।
মাইকজার্ভ

3
ifপরীক্ষার জন্য ডামি স্ট্রিংটি প্রয়োজনীয় নয় যদি চলকটি উদ্ধৃত হয়; if [ "$variable" = "yes" ]$ ভেরিয়েবল সেট না করা সত্ত্বেও ঠিকঠাক কাজ করে।
ড্যানিয়েল কুলম্যান

-2

মূলত যে কোনও সংখ্যা 0 নয় এটি সত্য এবং 0 টি মিথ্যা। বিভিন্ন ধরণের ত্রুটি চিহ্নিত করার জন্য কোনও স্ক্রিপ্টের সাফল্যমূলে শেষ হওয়ার জন্য বা অন্য কোনও সংখ্যার মান হিসাবে 0 হিসাবে ফিরে আসার কারণ।

$? পূর্ববর্তী কমান্ডের / এক্সিকিউটেবলের প্রস্থান কোডটি 0 সাফল্য এবং অন্য কোনও সংখ্যার ত্রুটি যা ফিরে পেয়েছে তা ফিরিয়ে দেবে।

সুতরাং আমি সেই পদ্ধতিটি সত্য / মিথ্যা জন্য ব্যবহার করব। if (( ! $? ));then OK;else NOOK;fi


আমি শেষ বিকল্পের জন্য একটি লিখব, তারপর। ধন্যবাদ.
Minix

5
একটি ননজারো নম্বর আসলে মিথ্যা এবং শূন্যটি সত্য। শুধু আউটপুট তাকান true; echo $?এবং false; echo $?
Ruslan

@Ruslan। আপনি কি আমার কমান্ডের আউটপুট চেক করেছেন? আমি অনুমান করি আপনি করেননি, অন্যথায় আপনি যা করেছেন তা আপনি বর্ণনা না করতেন। 0 টি মিথ্যা, অন্য কোনও সংখ্যা সত্য, ফলাফলটিকে সত্য বলে প্রত্যাখ্যান !করার কারণ । কমান্ডের ফলাফলটি 0 হয় যখন এটি সঠিকভাবে শেষ হয়, যার অর্থ এটি 0 টি সত্য is শব্দটি true0 হতে পারে, তবে 0 ifশর্তটি যেমনটি দেখায় তেমন সত্য হয় না ।
YoMismo

যে বলে যে সি / সি ++ হিসাবে একই 0হয় trueকারণ if(!x){True();}else{False();}ডাকব True()যখন x==0। তবে সঠিক চেকটি হবে না !x, বরং হবে !!x
Ruslan

তুমি ভুল করছ। আমি যা বলছি তা নিয়ে কোন কথা বলছি না এবং আপনি যা লিখছেন তা ifআমি কেবল এই পরে বর্ণনা করছি যে এখানে (বাশ, বা কেশ, বা টিশ, বা ....) সি / সি ++ এ 0 যেমন মিথ্যা, যে কোনও অন্য সংখ্যাটি সত্য, যেমন আপনি নীচের লিঙ্কটিতে পড়তে পারেন, সি এর প্রাথমিক বাস্তবায়নগুলি কোনও বুলিয়ান প্রকার সরবরাহ করে না, যেখানে ইনট হিসাবে সংজ্ঞায়িত করা হয় যেখানে 0 মিথ্যা এবং 1 টি সত্যই ছিল en.wikedia.org/wiki/Boolean_data_type
YoMismo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.