স্ট্রিংটি বৈধ পূর্ণসংখ্যা কিনা তা পরীক্ষা করুন


117

আমি যথেষ্ট সাধারণ কিছু করার চেষ্টা করছি: শেল স্ক্রিপ্টে ব্যবহারকারী ইনপুট পার্স করুন। যদি ব্যবহারকারী কোনও বৈধ পূর্ণসংখ্যার সরবরাহ করে তবে স্ক্রিপ্টটি একটি কাজ করে এবং যদি বৈধ না হয় তবে এটি অন্য কিছু করে। সমস্যাটি হ'ল, এটি করার কোনও সহজ (এবং যুক্তিসঙ্গত মার্জিত) উপায় আমি খুঁজে পাইনি - আমি চাই না যে এটিকে চর দিয়ে আলাদা করে নিতে পারি।

আমি জানি এটি সহজ হতে হবে তবে কীভাবে তা আমি জানি না। আমি এটি এক ডজন ভাষায় করতে পারলাম, তবে খালি নয়!

আমার গবেষণায় আমি এটি পেয়েছি:

বেস 10 তে কোনও স্ট্রিংটিতে একটি বৈধ আসল সংখ্যা রয়েছে কিনা তা পরীক্ষা করার জন্য নিয়মিত অভিব্যক্তি

এবং এর মধ্যে একটি উত্তর রয়েছে যা রেজেক্স সম্পর্কে কথা বলে, তবে যতদূর আমি জানি, এটি সিতে (অন্যদের মধ্যে) একটি ফাংশন উপলব্ধ। তবুও, এটি দুর্দান্ত উত্তরের মতো দেখতে পেয়েছিল তাই আমি গ্রেপ দিয়ে চেষ্টা করেছিলাম, তবে গ্রেপ এটি দিয়ে কী করতে পারে তা জানত না। আমি চেষ্টা করেছি-পি যা আমার বাক্সে এর অর্থ এটি PERL রেজিএক্সএক্স - নাদা হিসাবে বিবেচনা করা। ড্যাশ ই (-E )ও কাজ করেনি। এবং উভয়ই -F করেনি।

কেবল স্পষ্ট করে বলার জন্য, আমি এই জাতীয় কিছু চেষ্টা করছি, যে কোনও আউটপুট খুঁজছি - সেখান থেকে, আমি যা কিছু পাব তার সুবিধা নিতে আমি স্ক্রিপ্টটি হ্যাক করব। (আইওডাব্লু, আমি প্রত্যাশা করছিলাম যে একটি বৈধ লাইন পুনরাবৃত্তি হওয়ার পরে একটি অ-অনুসরনকারী ইনপুট কিছুই দেয় না))

snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
   echo "Not an integer - nothing back from the grep"
else
   echo "Integer."
fi

এটি কীভাবে খুব সহজে সম্পন্ন হয় কেউ দয়া করে বর্ণনা করতে পারেন?

সত্যি বলতে, এটি আমার মতে টেস্টের একটি সংক্ষিপ্ত-আগমন। এটির মতো পতাকা থাকা উচিত

if [ -I "string" ] ;
then
   echo "String is a valid integer."
else
   echo "String is not a valid integer."
fi

4
এফওয়াইআই: [পুরানো সামঞ্জস্যপূর্ণ test; [[আরও অপারেশন এবং বিভিন্ন উদ্ধৃতি বিধি সহ বাশের নতুন জিনিস new যদি আপনি ইতিমধ্যে বাশের সাথে লেগে থাকার সিদ্ধান্ত নিয়েছেন তবে যান [[(এটি সত্যিই খুব সুন্দর); আপনার যদি অন্য শেলগুলির কাছে বহনযোগ্যতা দরকার হয় তবে [[সম্পূর্ণ এড়ানো উচিত ।
প্রথম

উত্তর:


183
[[ $var =~ ^-?[0-9]+$ ]]
  • ^ইঙ্গিত ইনপুট প্যাটার্ন শুরুতে
  • -একটি আক্ষরিক হয় "-"
  • ?মানে হলো "0 বা পূর্ববর্তী 1 ( -)"
  • +"পূর্ববর্তী (1) বা তার বেশি 1 এর অর্থ [0-9]"
  • $ইনপুট প্যাটার্ন শেষে ইঙ্গিত

সুতরাং রেজেক্স একটি alচ্ছিক -(নেতিবাচক সংখ্যার ক্ষেত্রে) সাথে মিলে যায়, তার পরে এক বা একাধিক দশমিক অঙ্ক হয়।

তথ্যসূত্র :


3
ধন্যবাদ ইগনাসিও, আমি এক সেকেন্ডে চেষ্টা করব। আমি কি কিছুটা শিখতে পারি তা বোঝাতে কি আপত্তি করবেন? আমি এটি সংগ্রহ করি, "স্ট্রিং (^) এর শুরুতে একটি বিয়োগ চিহ্ন (-) optionচ্ছিক (?) হয়, তারপরে শূন্য এবং 9 এর মধ্যে যে কোনও সংখ্যক অক্ষর অন্তর্ভুক্ত থাকে" ... এবং তারপরে কী হতে পারে + মানে? ধন্যবাদ।
রিচার্ড টি

10
এর +অর্থ "পূর্ববর্তী 1 বা আরও বেশি", এবং $ইনপুট প্যাটার্নটির সমাপ্তি নির্দেশ করে। সুতরাং রেজেক্স -এক বা একাধিক দশমিক সংখ্যা অনুসরণ করে একটি alচ্ছিক সাথে মেলে ।
Ignacio Vazquez-Abram 21

গ্র্যাম্বলস পুনরায়: এবিএস লিঙ্ক
চার্লস ডাফি

এটি একটি স্পর্শকাতর, তবে নোট করুন যে চরিত্রের ব্যাপ্তি নির্দিষ্ট করার সময় আপনি অদ্ভুত ফলাফল পেতে পারেন; উদাহরণস্বরূপ, [A-z]শুধুমাত্র আপনিই দিতে হবে না হবে A-Zএবং a-zবরং \ , [, ], ^, _, এবং `
ডক্টর জ

অতিরিক্তভাবে, চরিত্রের জোটের উপর ভিত্তি করে ( এই সম্পর্কিত প্রশ্ন / উত্তর দেখুন ) এর মতো কিছু d[g-i]{2}কেবল মিলে যায় না digতবে dishসেই উত্তরের প্রস্তাবিত কোলেশনটিতেও শেষ হতে পারে (যেখানে shডিগ্রাফকে একক অক্ষর হিসাবে বিবেচনা করা হয়, পরে জড়িত h)।
ডক্টর জ

61

বাহ ... এখানে অনেক ভাল সমাধান আছে !! উপরের সমস্ত সমাধানগুলির মধ্যে, আমি @ সাথে সম্মত হন যে -eqএক লাইনার ব্যবহার করা সবচেয়ে দুর্দান্ত।

আমি জিএনইউ ব্যাশ, সংস্করণ 4.1.5(দেবিয়ান) চালাচ্ছি । আমি ksh এ এটি পরীক্ষা করে দেখেছি (SunSO 5.10)।

এখানে $1পূর্ণসংখ্যা কিনা তা পরীক্ষা করার জন্য আমার সংস্করণটি দেওয়া হল:

if [ "$1" -eq "$1" ] 2>/dev/null
then
    echo "$1 is an integer !!"
else
    echo "ERROR: first parameter must be an integer."
    echo $USAGE
    exit 1
fi

এই পদ্ধতির নেতিবাচক সংখ্যার জন্যও অ্যাকাউন্ট রয়েছে, যা অন্য কয়েকটি সমাধানে একটি ত্রুটিযুক্ত নেতিবাচক ফলাফল আসবে এবং এটি "+" (যেমন +30) এর উপসর্গের অনুমতি দেবে যা সম্ভবত একটি পূর্ণসংখ্যা is

ফলাফল:

$ int_check.sh 123
123 is an integer !!

$ int_check.sh 123+
ERROR: first parameter must be an integer.

$ int_check.sh -123
-123 is an integer !!

$ int_check.sh +30
+30 is an integer !!

$ int_check.sh -123c
ERROR: first parameter must be an integer.

$ int_check.sh 123c
ERROR: first parameter must be an integer.

$ int_check.sh c123
ERROR: first parameter must be an integer.

Ignacio Vazquez-Abram দ্বারা প্রদত্ত সমাধানটিও খুব পরিষ্কার ঝর্ণা (যদি আপনি রেজেক্স পছন্দ করেন) এটি ব্যাখ্যা করার পরে। তবে এটি +উপসর্গের সাথে ইতিবাচক সংখ্যাগুলি পরিচালনা করে না তবে এটি নীচের মত সহজেই স্থির করা যেতে পারে:

[[ $var =~ ^[-+]?[0-9]+$ ]]

নিস! বেশ অনুরূপ এই , যদিও।
ডিভনুল

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

ধন্যবাদ! আমি এটাকে সহজ এবং মার্জিত বলব।
এজরা নগ্রোহো

2
আপনার সমাধান এবং রেজেক্স একের মধ্যে একটি উল্লেখযোগ্য পার্থক্য রয়েছে: পূর্ণসংখ্যার আকার বাশ সীমাতে পরীক্ষা করা হয় (আমার কম্পিউটারে এটি 64 বিট)। এই সীমাটি regexp সমাধানটিতে আঘাত করে না। সুতরাং আপনার সমাধানটি bits৪বিট কম্পিউটারগুলিতে 9223372036854775807 এর চেয়ে বেশি সংখ্যায় ব্যর্থ হবে।
vaab

2
যেমনটি আমি সম্প্রতি আবিষ্কার করেছি, সেখানে কিছু ক্যাভেট রয়েছে
কাইল স্ট্র্যান্ড 21

28

এখানে পার্টিতে দেরি হওয়া আমি অত্যন্ত আশ্চর্য হয়েছি উত্তরগুলির মধ্যে সহজ, দ্রুততম, সবচেয়ে বহনযোগ্য সমাধানের কোনওটিরই উল্লেখ নেই; caseবিবৃতি।

case ${variable#[-+]} in
  *[!0-9]* | '') echo Not a number ;;
  * ) echo Valid number ;;
esac

তুলনা করার আগে কোনও চিহ্নের ছাঁটাই কিছুটা হ্যাকের মতো মনে হয় তবে এটি কেস স্টেটমেন্টের জন্য প্রকাশকে এত সহজ করে তোলে।


4
আমি আশা করি দুবারের কারণে এই প্রশ্নটিতে ফিরে আসার সময় আমি একবারই এটি উত্সাহিত করতে পারতাম। এটি আমার গিয়ারগুলি গ্রাইন্ড করে যে একটি সাধারণ তবুও পসিক্স-কমপ্লায়েন্ট সমাধানটি নীচে সমাহিত করা হয়।
অ্যাড্রিয়ান ফ্রেহওয়ার্থ

3
হতে পারে আপনার খালি স্ট্রিংয়ের যত্ন নেওয়া উচিত:''|*[!0-9]*)
নিক্লাস পিটার


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

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

10

আমি -eqপরীক্ষাটি ব্যবহার করে সমাধানটি পছন্দ করি কারণ এটি মূলত একটি ওয়ানলাইনার।

আমার নিজের সমাধানটি হ'ল সমস্ত সংখ্যাগুলি ফেলে দেওয়ার জন্য প্যারামিটার সম্প্রসারণ ব্যবহার করা এবং দেখার কিছু আছে কিনা। (আমি এখনও 3.0 ব্যবহার করছি, এর আগে [[বা exprআগে ব্যবহার করিনি, তবে তাদের সাথে সাক্ষাত করে আনন্দিত))

if [ "${INPUT_STRING//[0-9]}" = "" ]; then
  # yes, natural number
else
  # no, has non-numeral chars
fi

4
এটি ব্যবহার করে আরও উন্নত করা যেতে পারে [ -z "${INPUT_STRING//[0-9]}" ]তবে সত্যিই দুর্দান্ত সমাধান!
শেলফিশ

নেতিবাচক লক্ষণ সম্পর্কে কি?
স্কটিসিয়াস

-eqসমাধান কিছু বিষয় আছে; এখানে দেখুন: স্ট্যাকওভারফ্লো.com
কাইল স্ট্র্যান্ড

খালি INPUT_STRING নম্বর হিসাবে গণ্য করা হয়, সুতরাং আমার মামলায় ব্যর্থ হয়
মানভে

9

প্রাক-ব্যাশ ৩.১-এর বহনযোগ্যতার জন্য (যখন =~পরীক্ষা চালু হয়েছিল), ব্যবহার করুন expr

if expr "$string" : '-\?[0-9]\+$' >/dev/null
then
  echo "String is a valid integer."
else
  echo "String is not a valid integer."
fi

expr STRING : REGEXপ্রথম গোষ্ঠীর (বা ম্যাচের দৈর্ঘ্য, যদি না হয়) এবং প্রতিযোগিতা / ব্যর্থতা ফিরে আসার জন্য STRING এর শুরুতে নোঙর করা REGEX অনুসন্ধান করে। এটি পুরানো রেজেক্স সিনট্যাক্স, অতএব অতিরিক্ত \-\?"সম্ভবত -" এর [0-9]\+অর্থ "এক বা একাধিক অঙ্ক" এবং এর $অর্থ "স্ট্রিংয়ের সমাপ্তি"।

বাশ প্রসারিত গ্লোবগুলিকেও সমর্থন করে, যদিও এর পরে কোন সংস্করণটি আমার মনে নেই।

shopt -s extglob
case "$string" of
    @(-|)[0-9]*([0-9]))
        echo "String is a valid integer." ;;
    *)
        echo "String is not a valid integer." ;;
esac

# equivalently, [[ $string = @(-|)[0-9]*([0-9])) ]]

@(-|)"" -বা কিছুই নয় "এর [0-9]অর্থ" অঙ্ক "এবং এর *([0-9])অর্থ" শূন্য বা আরও বেশি সংখ্যা "।


আপনাকে প্রশংসিত, অনেক বাধ্য। আমি এর আগে = ~ সিনট্যাক্সটি কখনও দেখিনি - এবং এখনও এর অর্থ কী বলে অনুমান করা যায় - প্রায় সমান ?! ... আমি ব্যাশে প্রোগ্রাম কখনোই উত্তেজিত করে থাকেন কিন্তু এটা হয় কিছু সময়ের প্রয়োজন!
রিচার্ড টি

ইন awk, ~ছিল "রেজেক্স ম্যাচ" অপারেটর। পার্লে (সি থেকে অনুলিপি করা হিসাবে),~ ইতিমধ্যে "বিট পরিপূরক" এর জন্য ব্যবহৃত হয়েছিল, তাই তারা ব্যবহার করেছিল =~। পরবর্তীকালে এটি স্বরলিপি অন্যান্য কয়েকটি ভাষায় অনুলিপি করা হয়েছে। (পার্ল ৫.১০ এবং পার্ল ~~more এর মতো আরও, তবে এটির এখানে কোনও প্রভাব নেই)) আমি মনে করি আপনি এটিকে কিছুটা আনুমানিক সমতা হিসাবে
দেখেন

দুর্দান্ত পোস্ট এবং সম্পাদনা! আমি এর অর্থ বোঝানোর জন্য সত্যই প্রশংসা করি। আমি আশা করি আপনার এবং Ignacio এর পোস্ট দুটিই সঠিক উত্তর হিসাবে চিহ্নিত করতে পারতাম। -প্রশ্ন- আপনি ছেলেরা উভয় দুর্দান্ত। তবে আপনার যেমন তিনি দ্বিগুণ সুনাম অর্জন করেছেন, তেমনই আমি ইগনাসিওকে দিচ্ছি - আশা করি বুঝতে পেরেছেন! -স্মাইল-
রিচার্ড টি

4

এখানে আরও একবার এটি নেওয়া হয়েছে (কেবলমাত্র পরীক্ষার বিল্টিন কমান্ড এবং এর রিটার্ন কোড ব্যবহার করে):

function is_int() { return $(test "$@" -eq "$@" > /dev/null 2>&1); } 

input="-123"

if $(is_int "${input}");
then
   echo "Input: ${input}"
   echo "Integer: $[${input}]"
else
   echo "Not an integer: ${input}"
fi

1
এটি ব্যবহার $()করার প্রয়োজন নেই if। এই কাজ করে: if is_int "$input"। এছাড়াও, $[]ফর্মটি অবচয় করা হয়েছে। $(())পরিবর্তে ব্যবহার করুন। উভয়ের ভিতরেই ডলারের চিহ্নটি বাদ দেওয়া যেতে পারে: echo "Integer: $((input))"আপনার স্ক্রিপ্টের কোথাও কোঁকড়ানো ধনুর্বন্ধনী আবশ্যক।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

আমি আশা করতাম যে এটি বাশের বেস সংকেতকে বৈধ পূর্ণসংখ্যার হিসাবে পরিচালনা করবে (যা অবশ্যই কিছু সংজ্ঞা অনুসারে তারা; তবে এটি আপনার সাথে একমত হতে পারে না) তবে testএটি সমর্থন করে না বলে মনে হয়। [[না, যদিও। [[ 16#aa -eq 16#aa ]] && echo integer"পূর্ণসংখ্যা" মুদ্রণ করে।
ট্রিপলি

নোট করুন যে [[এই পদ্ধতির জন্য মিথ্যা ধনাত্মক ফেরত দেয়; যেমন [[ f -eq f ]]সফল। সুতরাং এটি ব্যবহার করা আবশ্যক testবা [
স্পিনআপ

3

আপনি অ-অঙ্কগুলি ছিনিয়ে নিতে এবং তুলনা করতে পারেন। এখানে একটি ডেমো স্ক্রিপ্ট রয়েছে:

for num in "44" "-44" "44-" "4-4" "a4" "4a" ".4" "4.4" "-4.4" "09"
do
    match=${num//[^[:digit:]]}    # strip non-digits
    match=${match#0*}             # strip leading zeros
    echo -en "$num\t$match\t"
    case $num in
        $match|-$match)    echo "Integer";;
                     *)    echo "Not integer";;
    esac
done

পরীক্ষার আউটপুটটি এটির মতো দেখাচ্ছে:

44 44 পূর্ণসংখ্যা
-44 44 পূর্ণসংখ্যা
44- 44 পূর্ণসংখ্যা নয়
4-4 44 পূর্ণসংখ্যা নয়
a4 4 পূর্ণসংখ্যা নয়
4 ক 4 পূর্ণসংখ্যা নয়
.4 4 পূর্ণসংখ্যা নয়
4.4 44 পূর্ণসংখ্যা নয়
-4.4 44 পূর্ণসংখ্যা নয়
09 9 পূর্ণসংখ্যা নয়

হাই ডেনিস, উপরে = ম্যাচের ডানদিকে সিনট্যাক্সের সাথে পরিচয় করানোর জন্য আপনাকে ধন্যবাদ। আমি আগে কখনও টাইপ সিনট্যাক্স লক্ষ্য করিনি। আমি টিআর থেকে কিছু সিনট্যাক্সকে চিনতে পারি (এমন একটি ইউটিলিটি যা আমি বেশ আয়ত্ত করতে পারি নি, তবে মাঝে মাঝে আমার পথে ভুগছি); আমি কোথায় এই ধরনের বাক্য গঠন পড়তে পারি? (যেমন, এই ধরণের জিনিসটি কী বলা হয়?) ধন্যবাদ
রিচার্ড টি

আপনি অধ্যায় সম্পর্কে তথ্যের জন্য "প্যারামিটারটি সম্প্রসারণ" নামক ব্যাশ মানুষ পৃষ্ঠা থেকে সন্ধান করতে পারেন ${var//string}এবং ${var#string}`(এটিও মধ্যে আবৃত করা হয় এবং অধ্যায়" প্যাটার্ন ম্যাচিং "[: অঙ্ক] ^ [] এর জন্য নামক man 7 regex)।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

1
match=${match#0*}নেই না নেতৃস্থানীয় শূণ্যসমূহ স্ট্রিপ, এটা সর্বাধিক এক শূন্য রেখাচিত্রমালা। সম্প্রসারণ ব্যবহার করে এটি কেবলমাত্র ব্যবহার করেই অর্জন করা extglobযায় match=${match##+(0)}
অ্যাড্রিয়ান ফ্রেহওয়ার্থ

9 বা 09 একটি পূর্ণসংখ্যা হয় না?
মাইক কিউ

@ মাইকিউকি: 09আপনি যদি পূর্ণসংখ্যার হিসাবে অগ্রণী জিরো না রাখার বিবেচনা করেন তবে এটি পূর্ণসংখ্যা নয়। পরীক্ষাটি হ'ল ইনপুট ( 09) একটি স্যানিটাইজড সংস্করণ ( 9- একটি পূর্ণসংখ্যার) সমান হয় এবং তা হয় না।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

2

আমার জন্য, সহজ সমাধানটি হ'ল একটি (())অভিব্যক্তির অভ্যন্তরে পরিবর্তনশীলটি ব্যবহার করা :

if ((VAR > 0))
then
  echo "$VAR is a positive integer."
fi

অবশ্যই, এই সমাধানটি কেবলমাত্র বৈধ যদি শূন্যের কোনও মান আপনার অ্যাপ্লিকেশনটির জন্য অর্থ না দেয়। আমার ক্ষেত্রে এটি সত্য হয়েছিল এবং এটি অন্যান্য সমাধানগুলির তুলনায় অনেক সহজ।

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


এমনকি আপনি আরও সহজ করে যেতে পারেনif (( var )); then echo "$var is an int."; fi
হারোন আর।

2
তবে এটি নেতিবাচক পূর্ণসংখ্যার জন্যও সত্য ফিরে আসবে, @ অ্যারোনার, ওপি যা খুঁজছিল তা নয়।
ট্রেবার রুড

2
এটি বিপজ্জনক, দেখুন: n = 1; var = "n"; যদি ((var)); তারপরে প্রতিধ্বনি "$ var একটি অন্তর্গঠন";; ফাই
জার্নো

2
এটি একটি খুব খারাপ ধারণা এবং নির্বিচারে কোড এক্সিকিউশন সাপেক্ষে: এটি নিজে চেষ্টা: VAR='a[$(ls)]'; if ((VAR > 0)); then echo "$VAR is a positive integer"; fi। এই মুহুর্তে আপনি খুশি হন আমি এর পরিবর্তে কোনও খারাপ আদেশ প্রবেশ করিনি ls। ওপি ব্যবহারকারীর ইনপুট উল্লেখ করেছে বলে , আমি সত্যিই আশা করি আপনি উত্পাদন কোডে ব্যবহারকারীর ইনপুট দিয়ে এটি ব্যবহার করছেন না!
gniourf_gniourf

যদি স্ট্রিংটিতে কিছু অঙ্ক থাকে তবে এটি কাজ করে না:agent007
brablc

1

বা সেড সহ:

   test -z $(echo "2000" | sed s/[0-9]//g) && echo "integer" || echo "no integer"
   # integer

   test -z $(echo "ab12" | sed s/[0-9]//g) && echo "integer" || echo "no integer"
   # no integer

বাশ এবং কিছু অন্যান্য "বোর্ন প্লাস" শেল আপনি কমান্ড প্রতিস্থাপন এবং বহিরাগত কমান্ডের সাহায্যে এড়াতে পারবেন test -z "${string//[0-9]/}" && echo "integer" || echo "no integer"... যদিও এটি মূলত ডেনিস উইলিয়ামসনের উত্তরটির

ধন্যবাদ! একমাত্র উত্তর যা এখানে প্রায় কাজ করে!
ব্যবহারকারী

নীরব বিকল্প:if [[ -n "$(printf "%s" "${2}" | sed s/[0-9]//g)" ]]; then
ব্যবহারকারী

0

Ignacio Vazquez-Abram থেকে উত্তরে যুক্ত করা হচ্ছে। এটি সংখ্যার পূর্বে + চিহ্নটির অনুমতি দেয় এবং এটি দশমিক পয়েন্ট হিসাবে যে কোনও সংখ্যক শূন্যকে মঞ্জুরি দেয়। উদাহরণস্বরূপ, এটি +45.00000000 কে একটি পূর্ণসংখ্যা হিসাবে বিবেচনা করার অনুমতি দেবে।
তবে, দশমিক পয়েন্ট ধারণ করতে অবশ্যই $ 1 ফর্ম্যাট করতে হবে। 45 এখানে পূর্ণসংখ্যা হিসাবে বিবেচিত হয় না, তবে 45.0 হয়।

if [[ $1 =~ ^-?[0-9]+.?[0]+$ ]]; then
    echo "yes, this is an integer"
elif [[ $1 =~ ^\+?[0-9]+.?[0]+$ ]]; then
    echo "yes, this is an integer"
else
    echo "no, this is not an integer"
fi

ইতিবাচক এবং নেতিবাচক সংখ্যার জন্য আপনি দুটি পৃথক নিয়মিত প্রকাশটি ব্যবহার করার কোনও কারণ নেই ^[-+]?[0-9]...?
ট্রিপলি

0

হাসির জন্য আমি মোটামুটি দ্রুত এটি করার জন্য একটি কার্যকারিতা সেট করেছি (is_string, is_int, is_float, আলফা স্ট্রিং বা অন্য) তবে এটি করার জন্য আরও কার্যকর (কম কোড) উপায় রয়েছে:

#!/bin/bash

function strindex() {
    x="${1%%$2*}"
    if [[ "$x" = "$1" ]] ;then
        true
    else
        if [ "${#x}" -gt 0 ] ;then
            false
        else
            true
        fi
    fi
}

function is_int() {
    if is_empty "${1}" ;then
        false
        return
    fi
    tmp=$(echo "${1}" | sed 's/[^0-9]*//g')
    if [[ $tmp == "${1}" ]] || [[ "-${tmp}" == "${1}" ]] ; then
        #echo "INT (${1}) tmp=$tmp"
        true
    else
        #echo "NOT INT (${1}) tmp=$tmp"
        false
    fi
}

function is_float() {
    if is_empty "${1}" ;then
        false
        return
    fi
    if ! strindex "${1}" "-" ; then
        false
        return
    fi
    tmp=$(echo "${1}" | sed 's/[^a-z. ]*//g')
    if [[ $tmp =~ "." ]] ; then
        #echo "FLOAT  (${1}) tmp=$tmp"
        true
    else
        #echo "NOT FLOAT  (${1}) tmp=$tmp"
        false
    fi
}

function is_strict_string() {
    if is_empty "${1}" ;then
        false
        return
    fi
    if [[ "${1}" =~ ^[A-Za-z]+$ ]]; then
        #echo "STRICT STRING (${1})"
        true
    else
        #echo "NOT STRICT STRING (${1})"
        false
    fi
}

function is_string() {
    if is_empty "${1}" || is_int "${1}" || is_float "${1}" || is_strict_string "${1}" ;then
        false
        return
    fi
    if [ ! -z "${1}" ] ;then
        true
        return
    fi
    false
}
function is_empty() {
    if [ -z "${1// }" ] ;then
        true
    else
        false
    fi
}

এখানে কিছু পরীক্ষার মধ্য দিয়ে চলুন, আমি সংজ্ঞায়িত করেছি যে -44 একটি অন্তর্নিহিত কিন্তু 44- ইত্যাদি নয়:

for num in "44" "-44" "44-" "4-4" "a4" "4a" ".4" "4.4" "-4.4" "09" "hello" "h3llo!" "!!" " " "" ; do
    if is_int "$num" ;then
        echo "INT = $num"

    elif is_float "$num" ;then
        echo "FLOAT = $num"

    elif is_string "$num" ; then
        echo "STRING = $num"

    elif is_strict_string "$num" ; then
        echo "STRICT STRING = $num"
    else
        echo "OTHER = $num"
    fi
done

আউটপুট:

INT = 44
INT = -44
STRING = 44-
STRING = 4-4
STRING = a4
STRING = 4a
FLOAT = .4
FLOAT = 4.4
FLOAT = -4.4
INT = 09
STRICT STRING = hello
STRING = h3llo!
STRING = !!
OTHER =  
OTHER = 

দ্রষ্টব্য: 0 এর শীর্ষস্থানীয় ব্যক্তিরা অক্টালের মতো সংখ্যা যুক্ত করার সাথে অন্য কিছু অনুভব করতে পারে তাই আপনি যদি '09' কে একটি আন্ত (যা আমি করছি) হিসাবে চিকিত্সা করতে চান তবে সেগুলি ফেলা ভাল (উদাহরণস্বরূপ expr 09 + 0বা সেডের সাথে স্ট্রিপ)

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