বাশ ফাংশন থেকে একটি মান ফেরত


10

আমার একটি ফাংশন রয়েছে যা যদি নম্বরটি একটি কার্যকর দশ দশকের সংখ্যা হয় তবে 1 প্রদান করে:

valNum()
{
    flag=1
    if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
        echo "Invalid Number"
        flag=0
    fi
    return $flag
}

এটি দ্বারা আহ্বান করা হচ্ছে:

if [[ $(valNum $num) -eq 1 ]]; then
      #do something
fi

সংখ্যাটি বৈধ হলে ফাংশনটি ঠিকঠাক কাজ করছে তবে ইনপুট যদি একটি অবৈধ সংখ্যা থাকে তবে সিনট্যাক্স ত্রুটি দেখাচ্ছে।

উত্তর:


14

@ চোরোবার উত্তর সঠিক, তবে এই উদাহরণটি আরও পরিষ্কার হতে পারে:

valNum $num
valNumResult=$? # '$?' is the return value of the previous command
if [[ $valNumResult -eq 1 ]]
then
  : # do something
fi

এই উদাহরণটি কিছুটা দীর্ঘ (সেটির $valNumResultপরে মানটি নির্ধারণ করে) তবে এটি কী ঘটে তা আরও স্পষ্টভাবে বর্ণনা করে: যা valNum()একটি মান দেয় এবং সেই মানটি জিজ্ঞাসা ও পরীক্ষা করা যেতে পারে।

পিএস দয়া করে নিজেকে অনুগ্রহ করুন এবং এর 0জন্য ফিরে আসুন এবং এর জন্য trueশূন্য নয় false। এইভাবে আপনি ব্যর্থতার ক্ষেত্রে "কেন আমরা ব্যর্থ হয়েছিল" নির্দেশিত করতে রিটার্ন মানটি ব্যবহার করতে পারেন।


8

ব্যাশের কাজগুলি কেবল প্রস্থান কোডগুলিই ফিরিয়ে দিতে পারে। বিপরীতভাবে কমান্ড প্রতিস্থাপনটি একটি কমান্ড বা ফাংশনটির স্ট্যান্ডার্ড আউটপুট পেতে ব্যবহৃত হয়। অতএব, প্রত্যাশিত পতাকাটি পরীক্ষা করতে আপনার বিকল্পের দরকার নেই:

if valNum "$num" ; then
    # ...
fi

তবে, এটি কাজ করার জন্য, সংখ্যাটি বৈধ হলে আপনার 0 টি ফিরে আসা উচিত, এবং যদি এটিটি না হয় তবে 1 টি (প্রস্থান কোড 0 এর অর্থ কোনও ত্রুটি নেই)।


আমি এটা পেতে না। উদাহরণস্বরূপ 24.7 এ tldp.org/LDP/abs/html/complexfunct.html ফাংশনটি সর্বাধিক মানটি ফিরিয়ে দিচ্ছে এবং প্রস্থান কোড নয়। যদিও আপনার পরামর্শটি কাজ করছে তবে আমি কেন বুঝতে পারছি তা বুঝতে সক্ষম হচ্ছি না
ব্যবহারকারী 2179293

1
যেহেতু আপনার পরীক্ষাটি খুঁজে বের করতে হবে যে ইনপুটটি বৈধ 10-সংখ্যার পূর্ণসংখ্য হয় কিনা, অর্থাত সত্য বা মিথ্যা, ফাংশনটি 0 বা 1 প্রদান করে ch কোরোবার উদাহরণটি কাজ করে কারণ "" যদি এটি সত্য হয় " if valnum "$num"to if valnum "$num" = 0শ স্ক্রিপ্টিংয়ে থাম্বের মূল নিয়ম হল 0 = সত্য / সাফল্য, অ-শূন্য = মিথ্যা / ত্রুটি।
ক্যাস

2
বিটিডাব্লু, যে "অ্যাডভান্সড ব্যাশ-স্ক্রিপ্টিং গাইড" খুব ভাল গাইড নয় - এটি অনেক কিছু সম্পর্কে ভুল এবং কিছু স্ক্রিপ্টিং অনুশীলনকে উত্সাহিত করে। মাইউকি.ইউইউইলজিইআরএইজে বাশ এফএকিউ অনেক ভাল রিসোর্স।
ক্যাস


কারণ এটি প্রতিধ্বনি-ing STRING "অবৈধ সংখ্যা" হয় আপনার ফাংশন ব্যর্থ হচ্ছে, এবং আপনি তারপর যে স্ট্রিং এবং সংখ্যা 1 এর মধ্যে একটি সাংখ্যিক তুলনা করছেনif [[ $(valNum $num) -eq 1 ]]
CA গুলির

5

আপনি শেল ফাংশন থেকে একটি স্বেচ্ছাসেবী ফলাফল দিতে পারবেন না। আপনি শুধুমাত্র একটি স্থিতি কোড যা 0 এবং 255 মধ্যে একটি পূর্ণসংখ্যা ফিরে আসতে পারেন (যদি আপনি একটি বড় মান পাস করতে পারেন যদিও returnমান, এটা ছেঁটে ফেলা হয়েছে মডিউল 256.) সাফল্য ও একটি পৃথক মান ব্যর্থতা ইঙ্গিত ইঙ্গিত 0 হওয়া আবশ্যক; কনভেনশন দ্বারা আপনার 1 এবং 125 এর মধ্যে ত্রুটি কোডগুলি আটকে থাকা উচিত, কারণ উচ্চ মানেরগুলির একটি বিশেষ অর্থ থাকে (উচ্চতর মানগুলির সংকেত দ্বারা নিহত 126 এবং 127 এর জন্য খারাপ বাহ্যিক কমান্ড)।

যেহেতু আপনি এখানে হ্যাঁ-বা-ফলাফল প্রত্যাবর্তন করছেন, একটি স্থিতি কোড উপযুক্ত। যেহেতু flagএকটি সাফল্য বা ব্যর্থতার ইঙ্গিত রয়েছে বলে মনে হয়, আপনার সাফল্যের জন্য 0 এবং ব্যর্থতার জন্য 1 এর প্রচলিত মানগুলি ব্যবহার করা উচিত (আপনি যা লিখেছেন তার বিপরীতে)। তারপরে আপনি যদি আপনার বিবরণটি সরাসরি একটি বিবৃতিতে ব্যবহার করতে পারেন।

valNum ()
{
  local flag=0
  if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
    echo 1>&2 "Invalid Number"
    flag=1
  fi
  return $flag
}
if valNum "$num"; then
  #do something
fi

আপনার যদি ব্যর্থতার কোডগুলির মধ্যে পার্থক্য করার প্রয়োজন হয় তবে সরাসরি ফাংশনটি কল করুন। এটি ফিরে আসার সাথে সাথেই, ব্যর্থতার কোডটি পাওয়া যায় $?। তারপরে আপনি কেস স্টেটমেন্ট দিয়ে এটি পরীক্ষা করতে পারেন:

valNum "$num"
case $? in 

আপনার যদি পরে স্থিতি কোডটি ব্যবহার করতে $?হয় তবে পরবর্তী কমান্ড দ্বারা ওভাররাইট করার আগে এটি অন্য ভেরিয়েবলে সংরক্ষণ করুন ।

valNum "$num"
valNum_status=$?

আপনি যা লিখেছেন তা কার্যকর হয়নি কারণ কমান্ড প্রতিস্থাপনটি $(…)ফাংশনের আউটপুটটিতে প্রসারিত হয়, যা আপনার কোডটিতে ত্রুটি বার্তা বা খালি হয়, কখনই নয় 1

যদি কোনও স্থিতি কোড শেল ফাংশন থেকে বেরিয়ে আসে তবে আপনাকে যদি আরও তথ্য পাস করতে হয় তবে আপনার দুটি সম্ভাবনা রয়েছে:

  • স্ট্যান্ডার্ড আউটপুটে কিছু পাঠ্য মুদ্রণ করুন এবং কমান্ড প্রতিস্থাপনে ফাংশনটি কল করুন: $(valNum "$num")
  • ফাংশনের ভিতরে এক বা একাধিক ভেরিয়েবলকে বরাদ্দ করুন এবং সেই পরিবর্তনগুলি পরে পড়ুন।

2

আমি নিজেই এই অঞ্চলে বিরোধী ফলাফল পেয়েছি। আমার অভিজ্ঞতাগত পরীক্ষাগুলির ফলাফল এখানে। প্রথমত, বাশ বা * নিক্স কমান্ড সম্পর্কে কিছু ' তত্ত্ব ':

  • সাফল্য == 0 ... যেমন। কোনও ত্রুটি স্থিতির কোড)
  • ব্যর্থ! = 0 ...... কিছু স্ট্যাটাস কোড

উদাহরণ:

if  ls -lt /nonexistantdir
then 
    echo "found"
else
    echo "FAIL"
fi
#
echo
ls -lt /nonexistantdir; echo "status = $?"
echo "status = $?"

আউটপুট:

ls: cannot access '/nonexistantdir': No such file or directory
FAIL... 

ls: cannot access '/nonexistantdir': No such file or directory
status = 2

দেখানো হিসাবে, lsকমান্ড আয় অবস্থা কোড = 2. আপনি একটি বৈধ ডিরেক্টরির চেষ্টা করেন, তখন অবস্থা শূন্য (হয় 0 )। প্রায় অন্যান্য সমস্ত ভাষার মতো নয়।

নিয়ম # 1 - করুন ...

  • সত্য == 0
  • মিথ্যা! = 0

আমাদের অবশ্যই মনে রাখতে হবে যে আমরা বাশ স্টেটমেন্টে ত্রুটি কোডগুলি পরীক্ষা করছি if। আমি ধ্রুবকগুলি সেট আপ করি বা আপনি শেল trueবা falseকমান্ড ব্যবহার করতে পারেন ।

TRUE=0
FALSE=1

#  valid number function
#
valNum()
{
    flag=$TRUE

    if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
        echo "Invalid Number"
        flag=$FALSE
    fi
    return $flag
}

#    later on ...
#
if validNum Abc 
then
    echo "Lucky number"
else
    echo "Not lucky."
fi

এবং আউটপুট:

Invalid Number
Not lucky.

তবে, আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি @ গিলসকে কোনও ' আপ-ভোট ' দিন কারণ তার উত্তরটি সঠিক। আমি কেবল ই-পেপারে সরলতর দিকটি পেতে চেয়েছিলাম।

আর একটি জিনিস, testআদেশ। এটির মতো দেখাচ্ছে:

[[ some-expression ]]; 

অধিকাংশ সময়. এবং উদাহরণস্বরূপ:

$ test 1
$ echo "result = $?"
result = 0
$ test 0
$ echo "result = $?"
result = 0

শূন্য (0) সত্য হচ্ছে । কেন? ওয়েল ম্যান পেজটি বলে যে একটি একক যুক্তি ' সত্য ' যখন এটি নল নয় UL

রেফারেন্স:

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