[0] অসীম লুপে যাওয়ার সময় কেন হয়?


23

আমি নীচের লুপের সাথে লুপের মতো একই আচরণ দেখছি while [ 1 ]। কেন যে এত?

while [ 0 ]; do
    echo "hello"
done

উত্তর:


33

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

পরিবর্তে আপনি চেষ্টা করতে পারেন

while false; do
  echo "hello"
done

সম্ভবত falseসঙ্গে প্রতিস্থাপন true। অথবা আপনি যা চান তা হ'ল (( )):

while (( 0 )); do
  echo "hello"
done

যা বেশিরভাগ ভাষার মতো আচরণ করবে, যেখানে 0 এর অর্থ ব্যর্থতা / মিথ্যা এবং 1 এর অর্থ সাফল্য / সত্য।


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

3
@রুখ ব্যাখ্যা করার সাথে সাথে, এই বক্তব্যটি ভুল: যখন এটিকে কোনও তুলনা, ফাইল পরীক্ষা, বা এটি করতে পারে এমন অন্যান্য অপারেশনগুলির মতো মনে হয় এমন কোনও অভিব্যক্তি দেওয়া হয় না, তখন এটি সাফল্য অর্জন করে। পরীক্ষা যেকোনো একক যুক্তি (বর্গাকার বন্ধনীর ভিতরে কোনো একক যুক্তি) সত্য বলে মনে করা হয় যদি যুক্তি একটি খালি স্ট্রিং নয়, এবং উভয় 0এবং 1খালি স্ট্রিং নয়। নতুন শেল প্রোগ্রামাররা প্রায়শই if [ 1=2 ]পরিবর্তে লিখেন if [ 1 = 2 ]এবং বিস্মিত হন যে পূর্ববর্তীটি সর্বদা কেন সত্য। এটি সত্য কারণ এটি একটি একক যুক্তি এবং খালি স্ট্রিং নয়।
আয়ান ডি অ্যালেন

ভাল কথা, আমি একটি সংশোধন করেছি।
উইজেডসবারমারিনার

10

এখানে মান 0 একটি সংখ্যার ধ্রুবক হিসাবে কাজ করে না, তবে একটি অক্ষরের স্ট্রিং হিসাবে কাজ করে। এই পরীক্ষাগুলি একটি সফল সমাপ্তি স্থিতি উত্পাদনের তাদের প্রভাবের সমস্ত সমতুল্য:

[ A ]
[ "XYZ" ]
[ 0 ]

এগুলি একটি ব্যর্থ সমাপ্তির স্থিতি উত্পাদন করে:

[ ]
[ "" ]

একটি খালি নয় যুক্তি আছে, যা যৌক্তিক সত্যকে মূল্যায়ন করে। এটি আপনাকে এ জাতীয় কাজ করতে দেয়:

if [ $UNDER_NUCLEAR_ATTACK ] ; then
  launch-missiles -a $DRY_RUN  # $DRY_RUN set to "-n" during testing
fi

ভেরিয়েবলটি UNDER_NUCLEAR_ATTACKসত্যটি নির্দেশ করতে কোনও নন-ফাঁকা মানকে সেট করা হয় বা অসম্পূর্ণ বা মিথ্যা নির্দেশ করতে খালি হয়।

!যুক্তিটি বিপরীত করতে আমরা অপারেটরটিকে প্রয়োগ করতে পারি :

[ ! a ]  # fails: a is nonblank so true; and not true is false.
[ ! ]    # succeeds: blank is false, not blank is true.

একটি সংখ্যার শর্তটি মূল্যায়নের জন্য আপনাকে সংখ্যার পরীক্ষা অপারেটরগুলি ব্যবহার করতে হবে:

 while [ $A -gt $B ] ; do ...

যদি Aএবং Bএর সাথে দশমিক পূর্ণসংখ্যার মতো দেখতে পাওয়া স্ট্রিং থাকে তবে তাদের সংখ্যার মতো তুলনা করা Aহয় Bএবং লুপটি কার্যকর হয়। সুতরাং ধরুন যে UNDER_NUCLEAR_ATTACKএটি কোনও স্ট্রিং-টাইপ বুলিয়ান নয় যা ফাঁকা বা ননব্ল্যাঙ্ক নয়, তবে আসলে একটি সংখ্যার বুলিয়ান যা হয় 0(মিথ্যা) বা অন্য কোনও মান (সত্য)। সেক্ষেত্রে আমরা পরীক্ষাটি এভাবে লিখব:

 if [ $UNDER_NUCLEAR_ATTACK -ne 0 ] ; then ...

-1

একটি যদি / তারপরে কমান্ডের তালিকার প্রস্থান স্থিতি 0 (যেহেতু 0 ইউনিক্স কনভেনশন দ্বারা "সাফল্য" মানে) পরীক্ষা করে, এবং যদি তা হয় তবে এক বা একাধিক কমান্ড কার্যকর করে tests

সংক্ষেপে, আপনি শূন্যের একটি পরীক্ষার ফলাফল ফিরিয়ে দিচ্ছেন।

http://www.tldp.org/LDP/abs/html/testconstructs.html


5
হ্যাঁ, তবে যে কারণে আপনি ভাবেন বলে মনে করছেন তা নয়। যদি [কেবল একটি যুক্তি পায় ( ]অবশ্যই বাদে ) স্থিতি শূন্যের সাথে প্রস্থান করে যদি তর্কটি খালি না হয় তবে ননজারো যদি হয়। সুতরাং, উদাহরণস্বরূপ, এর [ 1 ]একটি প্রস্থান কোডও ফেরত দেবে 0
কেভিন

-1

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

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