$ ব্যবহার করছেন? যদি একটি বিবৃতিতে


12
function foo {
   (cd $FOOBAR;
   <some command>
   if [$? -ne 0]
   then
      echo "Nope!"
   else
      echo "OK!"
   fi
   )
}

আমি উপরের মতো একটি ফাংশন লেখার চেষ্টা করছি এবং এটি আমার .bashrc ফাইলে রাখছি। আমি ফাইলটি উত্স এবং চালনার পরে, আমি পাই:

মোট সময়: 51 সেকেন্ড -
ব্যাশ: [1: কমান্ডটি
ঠিক আছে না !

কেউ আমার ভুল বুঝতে সাহায্য করতে পারে?


4
$?একটি ifস্টেটমেন্টের সাথে 0 সমান হলে পরীক্ষা করা অর্থহীন, ifএকটি আদেশের প্রত্যাশা করে এবং যদি কমান্ডটি ফিরে আসে 0, এটি ব্লকে কোড চালায়। তাই if true; then echo hello; fiপ্রতিধ্বনি হ্যালো যেহেতু কমান্ড হবে trueফিরে 0
llua

1
@ লুলুয়া এটি অর্থহীন নয়। $?সর্বশেষ পাইপলাইনটির স্থিতি রাখে , যা বিবৃতিতে test( [) আদেশ নয় if। উদাহরণটি পরীক্ষা করে দেখছে some commandযে সফল হয়েছিল কিনা । আপনি &&এবং এর সাথেও ||এটি করতে পারেন তবে এটি তুলনায় দীর্ঘ, অপঠনযোগ্য লাইন তৈরি করতে পারে if [ $? -eq 0 ]। একই যুক্তিটি if some command
চলেছে

@ বনসাইভিকিং আমি কী $?প্রসারিত তা সম্পর্কে আমি ভাল করেই অবহিত , আমি ইঙ্গিত করছি testযে ব্যবহৃত হওয়ার কোনও মানে নেই ; যেহেতু if some commandএকটি পৃথক পৃথক বিবৃতি বনাম একটি বিবৃতি একই জিনিস। যদি কমান্ডটি ইতিমধ্যে দীর্ঘ হয় তবে আরও তিনটি অক্ষর যুক্ত করলে 'অপঠনযোগ্য' ভয়ঙ্করভাবে আরও 'অপঠিত' হয়ে উঠবে না।
llua

উত্তর:


33

এর পরে এবং পরে [অন্য একটি স্থান যুক্ত করুন ]:

function foo {
   (cd $FOOBAR;
   <some command>
   if [ $? -ne 0 ]
   then
      echo "Nope!"
   else
      echo "OK!"
   fi
   )
}

[একটি শেল builtin, এটা কমান্ড ঠিক মত হল echo, read, expr... এটা পরে একটি স্পেস প্রয়োজন, এবং একটি মানানসই প্রয়োজন ]

লিখন [ $? -ne 0 ]আসলে invoking হয় [এবং এটি 4 পরামিতি দান: $?, -ne, 0, এবং ]

দ্রষ্টব্য: আপনি যে বলার ক্ষেত্রে ত্রুটি পেয়ে যাচ্ছেন তার [1: command not foundঅর্থ হল $?এর মান ছিল 1


1
আমি কেবল যাচাই করেছি যে আপনার উত্তরটি আমার লিনাক্স ভিএম-তে সঠিক।
সামিয়াম

[testপাশাপাশি একটি লিঙ্ক
রিকি বিম

2
@ রিকিবিয়াম বেশিরভাগ শেলের [মধ্যে একটি শেল বিল্টিন এবং এটি /usr/bin/[খুব কমই ব্যবহৃত হয়।
প্যাট্রিক

20

অথবা আপনি $?পুরোপুরি এড়িয়ে যেতে পারেন । যদি আপনার আদেশ হয় cmdতবে নিম্নলিখিতগুলি কাজ করা উচিত:

function foo {
   (cd $FOOBAR;
   if cmd
   then
      echo "OK!"
   else
      echo "Nope!"
   fi
   )
}

6

কোনও চলকটি ব্যবহারের আগে ফেরতের মান নির্ধারণ করা ভাল অনুশীলন

retval="$?"
if [ $retval -ne 0 ]

এটি আপনাকে ফেরতের মানটি পুনরায় ব্যবহার করতে দেয়। যেমন একটি যদি ... এলিফ ... অন্যথায় ... বিবৃতি।


-1: আপনি স্থানটি ভুলে গেছেন [( স্থান ছাড়াই এটি একটি সিনট্যাক্স ত্রুটিতে পরিণত হয় bash) আপনি যদি নিজের ত্রুটিটি সম্পাদনা করে ঠিক করেন তবে তা পূর্বাবস্থায় ফিরে আসবে।
সামিয়াম

হ্যাঁ, আপনি ঠিক বলেছেন। আমি এটা ঠিক করেছি.
আবদুল

@ সামিয়াম যে সর্বশেষ মন্তব্যটি আপনাকে নির্দেশিত হয়েছিল
টেরডন

4
:) আপনি আপনার উত্তর কিছুটা প্রসারিত করতে পারেন কেন এটি ভাল অনুশীলন? কী ধরণের ত্রুটিগুলি এড়ানো যায়?
টেরডন

1
@ স্টারডন এটি $?সরাসরি ব্যবহার করা খারাপ অভ্যাস কারণ এটি আপনি যদি পরে স্ক্রিপ্টটি সম্পাদনা করার সময় কমান্ড এবং $?চেকের মধ্যে একটি লাইন স্থাপন করেন তবে তা ভেঙে যায় ।
সামিয়াম

3

আপনি যখন কোনও নির্দিষ্ট ফেরতের স্থিতিতে বৈষম্য বজায় রাখতে চান তবে আপনি $?কোনও [আদেশের আর্গুমেন্ট হিসাবে ব্যবহার করতে চান (সেই [আদেশটি কোনও ifবিবৃতিতে শর্তাবলীতে চালিত হয় বা না) কেবল তা হ'ল:

until
  cmd
  [ "$?" -gt 1 ]
do
  something
done

সব তাদের জন্য সিনট্যাক্স if, while, until... বিবৃতি হল

if cmd-list1
then cmd-list2
else cmd-list3
fi

কোনটি রান cmd-list2যদি cmd-list1সফল হয় বা cmd-list3অন্যথায়।

[ "$?" -eq 0 ]কমান্ড কোন সমিতি হয়। এটি $?0 হলে $?0 হয় এবং $?অ-শূন্য যদি এটি শূন্য হয় তবে সেট করে।

আপনি যদি cmdব্যর্থ হয়ে কিছু চালাতে চান তবে তা হ'ল:

if ! cmd
then ...
fi

সাধারণত, আপনার সাথে Tinker প্রয়োজন হবে না $?দিন একা জানি যা মানের অর্থ হল trueবা false। কেবলমাত্র মামলাগুলি যেমন আমি উপরে বলেছি যদি আপনার কোনও নির্দিষ্ট মানকে বৈষম্যমূলক প্রয়োজন হয় বা আপনার যদি পরে এটি সংরক্ষণ করতে হয় (উদাহরণস্বরূপ এটি কোনও ফাংশনের রিটার্ন মান হিসাবে ফেরত পাঠানো হয়) যেমন:

f() {
  cmd; ret=$?
  some cleanup
  return "$ret"
}

এও মনে রাখবেন যে একটি ভেরিয়েবলকে উদ্ধৃত না করা হ'ল স্প্লিট + গ্লোব অপারেটর। এখানে সেই অপারেটরটি চাওয়ার কোনও অর্থ নেই, সুতরাং এটি হওয়া উচিত:

[ "$?" -ne 0 ]

না [ $? -ne 0 ], একা থাকুন [$? -ne 0 ](যা কেবলমাত্র প্রথম অক্ষরটি ধারণ করে [থাকলে কমান্ডটি উত্সাহিত করবে )।$IFS$?

আরও মনে রাখবেন যে ফাংশন সংজ্ঞায়িত করার বোর্ন উপায় হ'ল function-name()একটি কমান্ডের সামনে আটকে থাকা। প্রতিটি বোর্নে শেলের মতো শেল bashএবং yash(এবং এর সাম্প্রতিক সংস্করণগুলি posh) এর ক্ষেত্রে এটি কেবল একটি যৌগিক কমান্ড (যৌগিক কমান্ডগুলি হ'ল {...}বা (...)যেমন for...done, if...fi...

function foo { ... }হয় kshফাংশন সংজ্ঞা সিনট্যাক্স। আপনি এখানে এটি ব্যবহার করতে চান এমন কোনও কারণ নেই।

আপনার কোডটি বহনযোগ্যভাবে (POSIXly) লেখা যেতে পারে:

foo() (
  cd -P -- "$FOOBAR" || return # what if the cd failed!
  if
    <some command>
  then
    echo 'OK!'
  else
    echo 'Nope!'
  fi
)

এছাড়াও মনে রাখবেন cdছাড়া -Pখুব বিশেষ অর্থ (হ্যান্ডলগুলি পাথ যেগুলিতে হয়েছে ..উপাদান অন্য কোন হুকুম থেকে ভিন্নভাবে), তাই এটা এড়ানোর বিভ্রান্তি স্ক্রিপ্ট অন্তর্ভুক্ত ভাল।

(এই ফাংশন ব্যর্থ হলে ফিরে আসে, falseতবে cdব্যর্থ হলে না <some command>)।


1

আমি বিশ্বাস করি যে নীচের কমান্ডটি আপনার এক লাইনে যা চাইবে তা করবে।

(( verify = $?!=0?'Nope!':'OK!' ))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.