Bin 1 / বিন / ড্যাশ-তে পূর্ণসংখ্যা কিনা তা যাচাই করার সর্বোত্তম উপায় কী হবে?
ব্যাশে, আমি এটি করতে পারি:
[[ $1 =~ ^([0-9]+)$ ]]
তবে এটি পসিক্স অনুগত বলে মনে হয় না এবং ড্যাশ এটি সমর্থন করে না
Bin 1 / বিন / ড্যাশ-তে পূর্ণসংখ্যা কিনা তা যাচাই করার সর্বোত্তম উপায় কী হবে?
ব্যাশে, আমি এটি করতে পারি:
[[ $1 =~ ^([0-9]+)$ ]]
তবে এটি পসিক্স অনুগত বলে মনে হয় না এবং ড্যাশ এটি সমর্থন করে না
উত্তর:
নিম্নলিখিতটি পূর্ণসংখ্যাগুলি সনাক্ত করে, ধনাত্মক বা নেতিবাচক, এবং এর অধীনে কাজ করে dashএবং এটি পসিক্স হয়:
echo "$1" | grep -Eq '^[+-]?[0-9]+$' && echo "It's an integer"
case "${1#[+-]}" in
''|*[!0-9]*)
echo "Not an integer" ;;
*)
echo "Integer" ;;
esac
অথবা, :(নোপ) কমান্ডটির অল্প ব্যবহার সহ :
! case ${1#[+-]} in *[!0-9]*) :;; ?*) ! :;; esac && echo Integer
কিনা dash, bash, ksh, zsh, POSIX sh, অথবা posh( "বোর্ন শেল একটি reimplementation" sh ); caseকনস্ট্রাক্ট সবচেয়ে ব্যাপকভাবে উপলব্ধ এবং নির্ভরযোগ্য:
case $1 in (*[!0-9]*|"") false ;; (*) true ;; esac
dash? এটি আমার পক্ষে কাজ করে bashতবে তা হয় না dash।
dash; echo $?কেস কমান্ডের পরে ফলাফল যুক্ত করে জিজ্ঞাসাবাদ করতে ।
posh("বোর্ন শেল একটি পুনর্নির্মাণ") এর সমাধানের ক্ষেত্রেও কোনও সমস্যা নেই।
case; একটি কারণ আপনি যে বাগটি বর্ণনা করেছেন তা হ'ল অন্যটি হ'ল সম্পাদকদের মধ্যে এমন বৈশিষ্ট্য রয়েছে যা ম্যাচিং প্যারেন্থিসিসের উপর নির্ভর করে (ভিআইএম) এটি আরও ভাল সমর্থন দেয়, এবং কমপক্ষে আমি এগুলি মিলে যাওয়ার জন্য ব্যক্তিগতভাবে আরও সুগঠিত বলে মনে করি না। - ডাব্লুআরটি পজিক্স poshহচ্ছে; ভাল, আমি যে পৃষ্ঠাটি দিয়েছিলাম সেই পৃষ্ঠাটির উদ্ধৃতিটি অন্যরকম কিছু প্রস্তাব দিয়েছে, তবে কেউ এইভাবে অনানুষ্ঠানিক বক্তব্যের উপর নির্ভর করতে পারে না, আমার ধারণা। ওপেন বোর্ন শেল যেভাবে এখন আমরা পসিক্স যুগে এসেছি তা তাত্পর্যপূর্ণ নয়।
আপনি -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
" 023 "একটি সংখ্যা বলে দেবে। নোট করুন যে এটি ড্যাশ সহ কাজ করে, তবে অন্য সমস্ত পসিক্স শেলগুলি আচরণ হিসাবে বর্ণিত নয় কারণ অপারেটরগুলি দশমিক পূর্ণসংখ্য হয়। উদাহরণস্বরূপ ksh সহ এটি বলবে SHLVLবা 1+1একটি সংখ্যা।
এটি গাণিতিক সম্প্রসারণ হিসাবে ব্যবহার করার চেষ্টা করুন এবং দেখুন এটি কার্যকর হয় কিনা। প্রকৃতপক্ষে, আপনাকে তার চেয়ে কিছুটা কঠোর হওয়া দরকার কারণ উদাহরণস্বরূপ পাটিগণিতের বিস্তৃতি অগ্রণী এবং পিছনের স্থানগুলিকে উপেক্ষা করবে। সুতরাং একটি গাণিতিক সম্প্রসারণ করুন, এবং নিশ্চিত করুন যে প্রসারিত ফলাফলটি মূল ভেরিয়েবলের সাথে ঠিক মেলে।
check_if_number()
{
if [ "$1" = "$((${1}))" ] 2>/dev/null; then
echo "Number!"
else
echo "not a number"
fi
}
এটি নেতিবাচক সংখ্যাগুলিও গ্রহণ করবে - যদি আপনি সত্যই তাদের বাদ দিতে চান তবে একটি অতিরিক্ত চেক যোগ করুন $((${1} >= 0))।
[[
$(( ... ))? যদি তা হয় তবে আমার উত্তরটি এখনও বস্তুগতভাবে সঠিক হওয়া উচিত, আমার কেবল কিছু অতিরিক্ত উদ্ধৃতি যুক্ত করতে হবে।
check_if_number 1.2এবং ফাংশনটি ফিরে এসেছে: dash: 3: arithmetic expression: expecting EOF: "1.2"
সম্ভবত সঙ্গে 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,\}$'
পসিক্স সিস্টেমে আপনি এক্সপ্রেস ব্যবহার করতে পারেন :
$ a=a
$ expr "$a" - 0 >/dev/null 2>&1
$ [ "$?" -lt 2 ] && echo Integer || echo Not Integer
exprবাস্তবায়ন বলবে যে 999999999999999999999 কোনও পূর্ণসংখ্যা নয়। পসিক্স কোনও ওয়ারেন্টি দেয় না যে এটি কাজ করবে। অনুশীলনে, কমপক্ষে একটি জিএনইউ সিস্টেমে এটি বলবে যে "দৈর্ঘ্য" একটি পূর্ণসংখ্যা।
expr 9999999999999999999 + 0আমাকে একটি 3 প্রস্থান অবস্থা দেয় এবং expr -12 + 0এবং expr length + 0আমাকে গনুহ expr সঙ্গে একটি 0 প্রস্থান মর্যাদা দিতে ( + stringবাহিনীর stringগনুহ সঙ্গে একটি স্ট্রিং হিসাবে বিবেচনা করা expr। expr "$a" - 0আরো ভালোভাবে কাজ হবে)।
-12একটি বৈধ পূর্ণসংখ্যা এবং 9999999999999999999একটি ওভারফ্লো দিয়েছে।
মুড়ুর উত্তর হিসাবে একই পদ্ধতি ব্যবহার করে এখানে একটি সাধারণ ফাংশন :
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
foo\n123\nbarকোনও পূর্ণসংখ্যা নয়, তবে এই পরীক্ষায় উত্তীর্ণ হবে।