/ বিন / ড্যাশ: $ 1 একটি সংখ্যা কিনা তা পরীক্ষা করে দেখুন


12

Bin 1 / বিন / ড্যাশ-তে পূর্ণসংখ্যা কিনা তা যাচাই করার সর্বোত্তম উপায় কী হবে?

ব্যাশে, আমি এটি করতে পারি:

[[ $1 =~ ^([0-9]+)$ ]]

তবে এটি পসিক্স অনুগত বলে মনে হয় না এবং ড্যাশ এটি সমর্থন করে না

উত্তর:


12

নিম্নলিখিতটি পূর্ণসংখ্যাগুলি সনাক্ত করে, ধনাত্মক বা নেতিবাচক, এবং এর অধীনে কাজ করে dashএবং এটি পসিক্স হয়:

বিকল্প 1

echo "$1" | grep -Eq '^[+-]?[0-9]+$' && echo "It's an integer"

বিকল্প 2

case "${1#[+-]}" in
    ''|*[!0-9]*)
        echo "Not an integer" ;;
    *)
        echo "Integer" ;;
esac

অথবা, :(নোপ) কমান্ডটির অল্প ব্যবহার সহ :

! case ${1#[+-]} in *[!0-9]*) :;; ?*) ! :;; esac && echo Integer

5
স্ট্রিংয়ে নিউলাইনগুলি থাকলে কী হবে? foo\n123\nbarকোনও পূর্ণসংখ্যা নয়, তবে এই পরীক্ষায় উত্তীর্ণ হবে।
গডলিজিক

3
গ্রেপ সংস্করণ, যে। কেস সংস্করণটি সঠিক দেখাচ্ছে।
গডলিজিক

5

কিনা dash, bash, ksh, zsh, POSIX sh, অথবা posh( "বোর্ন শেল একটি reimplementation" sh ); caseকনস্ট্রাক্ট সবচেয়ে ব্যাপকভাবে উপলব্ধ এবং নির্ভরযোগ্য:

case $1 in (*[!0-9]*|"") false ;; (*) true ;; esac

আপনি এই অধীনে পরীক্ষা করেছেন dash? এটি আমার পক্ষে কাজ করে bashতবে তা হয় না dash
1024

হ্যাঁ, আমি এটি আমার সিস্টেমেও এটি দিয়ে পরীক্ষা করেছি dash; echo $?কেস কমান্ডের পরে ফলাফল যুক্ত করে জিজ্ঞাসাবাদ করতে ।
জ্যানিস

আমি একই (দেবিয়ান স্থিতিশীল) করেছি কিন্তু আনন্দ নেই। আমার ড্যাশ অধীনে আমার জন্য কাজ করে এমন একটি সম্পূর্ণ উদাহরণের জন্য, আমার বিকল্প 2 দেখুন
1024

হুম, আমার কাছে পরীক্ষার জন্য কোনও বর্ন শেল উপলব্ধ নেই। আমি "দস্তাবেজগুলি [ksh- তে বোর্ন শেল নয়") সম্পর্কে যে দস্তাবেজগুলি পরিদর্শন করেছি সেগুলিতে অন্তত এটি উল্লেখ করা হয়নি, তাই আমি ধরে নিয়েছি এটি সেখানে ছিল। কোন? - তারপরে অগ্রণী বন্ধনী বাদ দিন। - ওটিওএইচ, posh("বোর্ন শেল একটি পুনর্নির্মাণ") এর সমাধানের ক্ষেত্রেও কোনও সমস্যা নেই।
জ্যানিস

1
@mikeserv; আমি সর্বদা মিলে যাওয়া বন্ধনীগুলি কেন ব্যবহার করি তার বিভিন্ন কারণ রয়েছে case; একটি কারণ আপনি যে বাগটি বর্ণনা করেছেন তা হ'ল অন্যটি হ'ল সম্পাদকদের মধ্যে এমন বৈশিষ্ট্য রয়েছে যা ম্যাচিং প্যারেন্থিসিসের উপর নির্ভর করে (ভিআইএম) এটি আরও ভাল সমর্থন দেয়, এবং কমপক্ষে আমি এগুলি মিলে যাওয়ার জন্য ব্যক্তিগতভাবে আরও সুগঠিত বলে মনে করি না। - ডাব্লুআরটি পজিক্স poshহচ্ছে; ভাল, আমি যে পৃষ্ঠাটি দিয়েছিলাম সেই পৃষ্ঠাটির উদ্ধৃতিটি অন্যরকম কিছু প্রস্তাব দিয়েছে, তবে কেউ এইভাবে অনানুষ্ঠানিক বক্তব্যের উপর নির্ভর করতে পারে না, আমার ধারণা। ওপেন বোর্ন শেল যেভাবে এখন আমরা পসিক্স যুগে এসেছি তা তাত্পর্যপূর্ণ নয়।
জ্যানিস

1

আপনি -eqস্ট্রিংটিতে নিজেই পরীক্ষাটি ব্যবহার করতে পারেন :

$ dash -c 'a="a"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi' 
dash: 1: [: Illegal number: a
not a number
$ dash -c 'a="0xa"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
dash: 1: [: Illegal number: 0xa
not a number
$ dash -c 'a="-1"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
number

ত্রুটি বার্তাটি যদি সমস্যা হয় তবে ত্রুটি আউটপুট এতে পুনর্নির্দেশ করুন /dev/null:

$ dash -c 'a="0xa"; [ "$a" -eq "$a" ] 2>/dev/null|| echo no'
no

1
এটি এটিও " 023 "একটি সংখ্যা বলে দেবে। নোট করুন যে এটি ড্যাশ সহ কাজ করে, তবে অন্য সমস্ত পসিক্স শেলগুলি আচরণ হিসাবে বর্ণিত নয় কারণ অপারেটরগুলি দশমিক পূর্ণসংখ্য হয়। উদাহরণস্বরূপ ksh সহ এটি বলবে SHLVLবা 1+1একটি সংখ্যা।
স্টাফেন চেজেলাস

0

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

check_if_number()
{
    if [ "$1" = "$((${1}))" ] 2>/dev/null; then
        echo "Number!"
    else
        echo "not a number"
    fi
}

এটি নেতিবাচক সংখ্যাগুলিও গ্রহণ করবে - যদি আপনি সত্যই তাদের বাদ দিতে চান তবে একটি অতিরিক্ত চেক যোগ করুন $((${1} >= 0))


1

নিবন্ধন করুন এটা আছে $(( ... ))? যদি তা হয় তবে আমার উত্তরটি এখনও বস্তুগতভাবে সঠিক হওয়া উচিত, আমার কেবল কিছু অতিরিক্ত উদ্ধৃতি যুক্ত করতে হবে।
গডলিজিক

এটি আপনার উত্তর: খুঁজে যান।
গ্লেন জ্যাকম্যান 21

দেখে মনে হচ্ছে এটি ঠিক আছে তাই আমার আপডেট হওয়া সংস্করণটি কৌশলটি করা উচিত। এটি পরীক্ষা করার জন্য আমার কাছে ড্যাশ নেই, যদিও - তাই যদি আমি অন্য কিছু মিস করি তবে আমাকে জানান।
গডলিজিক

আমি চেষ্টা করেছি: check_if_number 1.2এবং ফাংশনটি ফিরে এসেছে: dash: 3: arithmetic expression: expecting EOF: "1.2"
1024

0

সম্ভবত সঙ্গে expr?

if expr match "$1" '^\([0-9]\+\)$' > /dev/null; then
  echo "integer"
else 
  echo "non-integer"
fi

তন্ন তন্ন matchনা \+POSIX হয়। এটি আরও বলবে যে 0 একটি সংখ্যা নয়। আপনি চানexpr "x$1" : 'x[0-9]\{1,\}$'
স্টাফেন চ্যাজেলাস

0

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

$ a=a
$ expr "$a" - 0 >/dev/null 2>&1
$ [ "$?" -lt 2 ] && echo Integer || echo Not Integer

এটি বলবে যে 0টি কোনও পূর্ণসংখ্যা নয় (এবং বলুন -12 এটিই ওপি'র বাশ সমাধানটি প্রত্যাখ্যান করবে)। কিছু exprবাস্তবায়ন বলবে যে 999999999999999999999 কোনও পূর্ণসংখ্যা নয়। পসিক্স কোনও ওয়ারেন্টি দেয় না যে এটি কাজ করবে। অনুশীলনে, কমপক্ষে একটি জিএনইউ সিস্টেমে এটি বলবে যে "দৈর্ঘ্য" একটি পূর্ণসংখ্যা।
স্টাফেন চেজেলাস

আমার পরীক্ষায় এটি কমপক্ষে ডেবিয়ান এবং ওএসএক্সে কাজ করে। এটি 0 এর জন্য পূর্ণসংখ্যার কথা বলে না ix
cuonglm

ওহ হ্যাঁ, দুঃখিত, আমি আপনার পরীক্ষাকে look এর জন্য উপেক্ষা করেছি? <2. এখনও expr 9999999999999999999 + 0আমাকে একটি 3 প্রস্থান অবস্থা দেয় এবং expr -12 + 0এবং expr length + 0আমাকে গনুহ expr সঙ্গে একটি 0 প্রস্থান মর্যাদা দিতে ( + stringবাহিনীর stringগনুহ সঙ্গে একটি স্ট্রিং হিসাবে বিবেচনা করা exprexpr "$a" - 0আরো ভালোভাবে কাজ হবে)।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস: ওহ, হ্যাঁ, আমার উত্তর আপডেট করেছে। আমি মনে করি -12একটি বৈধ পূর্ণসংখ্যা এবং 9999999999999999999একটি ওভারফ্লো দিয়েছে।
cuonglm

0

মুড়ুর উত্তর হিসাবে একই পদ্ধতি ব্যবহার করে এখানে একটি সাধারণ ফাংশন :

IsInteger()      # usage: IsInteger string
{               #  returns: flag
        [ "$1" -eq "$1" ] 2> /dev/null
}

উদাহরণ:

p= n=2a3; IsInteger $n || p="n't" ; printf "'%s' is%s an integer\n" "$n" "$p"
p= n=23;  IsInteger $n || p="n't" ; printf "'%s' is%s an integer\n" "$n" "$p"

আউটপুট:

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