কোনও ইনপুট নম্বরটি পূর্ণসংখ্যা কিনা তা পরীক্ষা করা হচ্ছে


31

আমি কোনও ইনপুটটি পূর্ণসংখ্যা কিনা তা যাচাই করার চেষ্টা করছি এবং আমি এটি একশ বার করে দিয়েছি তবে এতে ত্রুটিটি দেখতে পাচ্ছি না। হায়রে এটি কাজ করে না, এটি সমস্ত ইনপুটগুলির জন্য if স্টেটমেন্ট (সংখ্যা / অক্ষর) ট্রিগার করে

read scale
if ! [[ "$scale" =~ "^[0-9]+$" ]]
        then
            echo "Sorry integers only"
fi

আমি উদ্ধৃতিগুলি নিয়ে চারপাশে খেলেছি তবে এটি মিস হয়েছে বা এটি কিছুই করেনি। আমি কি ভুল করব? কোনও ইনপুট যদি কেবল একটি INTEGER হয় তা পরীক্ষা করার আরও সহজ উপায় আছে কি?

উত্তর:


25

উদ্ধৃতিগুলি সরান

if ! [[ "$scale" =~ ^[0-9]+$ ]]
    then
        echo "Sorry integers only"
fi

stackoverflow.com/questions/806906/... কোট পিছন ছিল
lonewarrior556

সুতরাং একটি বাগ আছে। উদ্ধৃতি সহ regexp আক্ষরিক স্ট্রিং হিসাবে গণ্য করা হয়। যেটি scale='^[0-9]+$'; [[ "$scale" == "^[0-9]+$" ]] && echo equal || echo "not equal"
এটির

15

পরীক্ষা কমান্ডের -eqঅপারেটর ব্যবহার করুন :

read scale
if ! [ "$scale" -eq "$scale" ] 2> /dev/null
then
    echo "Sorry integers only"
fi

এটি শুধুমাত্র কাজ করে না bashতবে কোনও পসিক্স শেলও কাজ করে। পসিক্স পরীক্ষার ডকুমেন্টেশন থেকে:

n1 -eq  n2
    True if the integers n1 and n2 are algebraically equal; otherwise, false.

এটি পরীক্ষা করে এটির কোনও সংখ্যা কিনা, কেবল পূর্ণসংখ্যার নয়
lonewarrior556

2
@ lonewarrior556: এটি কেবল পূর্ণসংখ্যার জন্য কাজ করে, দেখুন: pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html । আমার ধারণা আপনি যে কোনও সংখ্যার জন্য বলেছিলেন কারণ আপনি আমার হিসাবে [[পুরানো পরীক্ষার পরিবর্তে নতুন পরীক্ষা ব্যবহার করেন [
cuonglm

ভাল ধারণা তবে কিছুটা গোলমাল। আমি বরং ত্রুটিগুলি দেব শূন্যে পুনর্নির্দেশ করতে চাই না।
ওয়াইল্ডকার্ড

2
@ উইল্ডকার্ড: হ্যাঁ, আমরা বহনযোগ্যতার জন্য এটি প্রদান করি।
cuonglm

8

স্বাক্ষরবিহীন পূর্ণসংখ্যার জন্য আমি ব্যবহার করি:

read -r scale
[ -z "${scale//[0-9]}" ] && [ -n "$scale" ] || echo "Sorry integers only"

পরীক্ষা:

$ ./test.sh
7
$ ./test.sh
   777
$ ./test.sh
a
Sorry integers only
$ ./test.sh
""
Sorry integers only
$ ./test.sh

Sorry integers only

1
এটি বিল্টিন, দ্রুত, এবং বেশিরভাগ পিক্সিক্স দিয়ে তৈরি করা হিসাবে আমি পছন্দ করি ... আমি একটি পুরানো শেল (ব্যাশ ২.০.৫) দিয়ে চেষ্টা করেছি এবং এটি পুরোপুরি কাজ করে।
অলিভিয়ার ডুলাক

যুক্তির ভিতরে ফাঁকা জায়গাগুলি কী? "086" এর মতো ।
ইন্দ্রিয়

@ 0 এবং দ্বিতীয় পরীক্ষা দেখুন।
raciasolvo

8

ওপি যেমন কেবল ইতিবাচক পূর্ণসংখ্যা চায় বলে মনে হচ্ছে:

[ "$1" -ge 0 ] 2>/dev/null

উদাহরণ:

$ is_positive_int(){ [ "$1" -ge 0 ] 2>/dev/null && echo YES || echo no; }
$ is_positive_int word
no
$ is_positive_int 2.1
no
$ is_positive_int -3
no
$ is_positive_int 42
YES

মনে রাখবেন যে একটি একক [পরীক্ষা প্রয়োজন:

$ [[ "word" -eq 0 ]] && echo word equals zero || echo nope
word equals zero
$ [ "word" -eq 0 ] && echo word equals zero || echo nope
-bash: [: word: integer expression expected
nope

এর কারণ হ'ল ডেরেফারেন্সিং এর সাথে ঘটে [[:

$ word=other
$ other=3                                                                                                                                                                                  
$ [[ $word -eq 3 ]] && echo word equals other equals 3
word equals other equals 3

এটিই আসল উত্তর ... অন্যরা ব্যর্থ হয়েছে
স্কট স্টেনসল্যান্ড

3
( scale=${scale##*[!0-9]*}
: ${scale:?input must be an integer}
) || exit

এটি পরীক্ষা করে এবং আপনার ত্রুটি আউটপুট করে।


OPTINDএখানেও ভাল। শুধু সায়ান।
মাইকসার্ভ

2

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

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