বাশ-এর ​​শর্তাধীন কোন আদেশের অর্থ "কিছুই করবেন না"?


180

কিছু সময় শর্তসাপেক্ষে তৈরি করার সময় আমার কিছু না করার কোড প্রয়োজন, যেমন, এখানে আমি $a"10" এর চেয়ে বড় হলে বাশকে কিছু না করা চাই , $a"5" এর চেয়ে কম হলে "1" মুদ্রণ করুন, অন্যথায়, "2" মুদ্রণ করুন:

if [ "$a" -ge 10 ]
then
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

এটি যদিও ত্রুটি করে। এমন কোনও আদেশ আছে যা কিছু করতে পারে না এবং আমার স্ক্রিপ্টটি ধীর করবে না?

উত্তর:


340

শেলের কোনও অপ-কমান্ড হ'ল :(কোলন)।

if [ "$a" -ge 10 ]
then
    :
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

থেকে ব্যাশ ম্যানুয়াল :

:(একটি কোলন)
যুক্তিগুলি প্রসারিত করা এবং পুনর্নির্দেশগুলি সম্পাদনের বাইরে কিছু করবেন না। ফেরতের অবস্থা শূন্য।


3
@ সেনটহ্যাক্স নং, এটি চালায় না true। এটি খোলের মধ্যে নির্মিত, এবং কিছুই করে না।
বার্মার

1
এটি শেলটি অন্তর্নির্মিত (আপনি সঠিক), এটি সত্য (স্ট্যাটাস 0) সত্যের মতো করে দেয় এবং এটি পড়া আরও কঠিন। বাশ একটি ডিভোপস ভাষা এবং :আমার টিমের কেউ যদি এটি লিখে থাকেন তবে আমি তাদের এটি পরিবর্তন করতে চাই।
সেন্টহ্যাক্স

3
@ সেনটহ্যাক্স যদি কেউ trueশর্তাধীন পরিস্থিতি ব্যবহার করে তবে আমি তাদের এটি পরিবর্তন করতে চাই। if trueঠিক আছে, then trueভুল মনে হচ্ছে।
বর্মার

1
অবশ্যই, আপনি কেবল কোডটি ব্যবহারের if ! condition; then do something; fiপরিবর্তে নতুন করে লিখতে পারেন if condition; then :; else do something; fi
বর্মার

আমি আপনার সাথে একমত. এই উদাহরণটি যদি / এলিফ / অন্যথায় যৌগিক শর্তগুলি ব্যবহার করে লেখা যায় তবে এটি আরও ভাল।
সেন্টহ্যাক্স

38

আপনি সম্ভবত trueকমান্ডটি ব্যবহার করতে পারেন :

if [ "$a" -ge 10 ]; then
    true
elif [ "$a" -le 5 ]; then
    echo "1"
else
    echo "2"
fi

একটি বিকল্প, আপনার উদাহরণের ক্ষেত্রে (তবে অগত্যা সর্বত্র নয়) আপনার / যদি অন্যথায় পুনরায় অর্ডার দেওয়া হয়:

if [ "$a" -le 5 ]; then
    echo "1"
elif [ "$a" -lt 10 ]; then
    echo "2"
fi

8
আপনি ফলাফল পরীক্ষা যদি না উভয় trueএবং falseকার্যকরভাবে যতটা স্ক্রিপ্ট সংশ্লিষ্ট হয় নো-অপস, কিন্তু নীতিগতভাবে তারা পারে কিছু শাঁস যে এই সিনট্যাক্স গ্রহণ তাই সম্ভবত মোড় :উত্তম।
ডিএমকেকে --- প্রাক্তন মডারেটর বিড়ালছানা

3
প্রশ্ন ট্যাগ বাঁশ। ব্যাশে, trueএবং falseবিল্ট-ইনগুলি রয়েছে। পুরোনো শেল জন্য true, falseএবং এমনকি :বাইরের কমান্ড হতে পারে (যদিও আপনি সম্ভবত শুধুমাত্র আধুনিক দেখতে না খুব পুরাতন শাঁস)।
কিথ থম্পসন

6
আমি :কেবল এটিকে পছন্দ করি কারণ উদ্দেশ্যটি কী তা আরও স্পষ্ট
ফ্রিডম_বেন

9

যদিও আমি অপ-কমান্ডকে সংগৃহীত মূল প্রশ্নের উত্তর দিচ্ছি না, তবুও " (এই শাখায় আমাকে কিছু করতে হবে না " ) মনে করতে পারে এমন অনেকগুলি (বেশিরভাগ না হলে) সমস্যাগুলি কেবল যুক্তির পুনর্গঠন করেই বাইপাস করা যায় যাতে এই শাখাটি জিতে যায় ঘটবে না

আমি ওপিএস উদাহরণ ব্যবহার করে একটি সাধারণ নিয়ম দেওয়ার চেষ্টা করি

10 a "10" এর চেয়ে বড় হলে কিছুই করবেন না, 1 a "5" এর চেয়ে কম হলে "1" মুদ্রণ করুন, অন্যথায়, "2" মুদ্রণ করুন

আমাদের একটি শাখা এড়াতে হবে যেখানে $a10 এরও বেশি পাওয়া যায়, সুতরাং $a < 10সাধারণ শর্তটি একে অপরের সাথে প্রয়োগ করা যেতে পারে, নিম্নলিখিত শর্তটি অনুসরণ করে।

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

সুতরাং প্রয়োগ করা বিধি সহ ওপিএস উদাহরণটি পুনর্গঠিত হতে পারে:

if [ "$a" -lt 10 ] && [ "$a" -le 5 ]
then
    echo "1"
elif [ "$a" -lt 10 ]
then
    echo "2"
fi

উপরের মাত্র একটি প্রকরণ, সমস্ত কিছু $a < 10শর্তের সাথে আবদ্ধ করে :

if [ "$a" -lt 10 ]
then
    if [ "$a" -le 5 ]
    then
        echo "1"
    else
        echo "2"
    fi
fi

(এই নির্দিষ্ট উদাহরণের জন্য @ ফ্লিমজি পুনর্গঠন অবশ্যই অবশ্যই আরও ভাল, তবে কীভাবে কীভাবে করবেন না সে অনুসন্ধান করা সমস্ত লোকের জন্য আমি একটি সাধারণ নিয়ম দিতে চেয়েছিলাম))


5
কেউ অনিচ্ছুক হতে পারে এমন একটি কারণ হ'ল প্রাথমিকভাবে এই ধারণাটি সহ কোডটি গঠন করা হচ্ছে যে অজান্তে পার্শ্ব প্রতিক্রিয়া ছাড়াই কেউ "পরে এখানে কিছু যুক্ত করুন" যুক্ত করবে। উদাহরণস্বরূপ, যদি কেউ .bashrc- এ যদি একটি-পরে-অন্য-ফাই লাগাচ্ছে, আপনি echo "put stuff here"এটি রাখেন তবে লগইনবিহীন কিছু ব্যবহার (যেমন scp নষ্ট হয়ে যায়) ভাঙবে, এবং কেবল সাদা স্থান / মন্তব্যগুলি রানটাইম ত্রুটির কারণ হতে পারে।
এফয়েড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.