বাশে আমি কীভাবে এমন কিছু করতে পারি?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
বাশে আমি কীভাবে এমন কিছু করতে পারি?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
উত্তর:
শর্তসাপেক্ষে কীভাবে কিছু করা যায় যদি কোনও আদেশ সফল হয় বা ব্যর্থ হয়
বাশের if
বক্তব্য ঠিক এটাই করে:
if command ; then
echo "Command succeeded"
else
echo "Command failed"
fi
মন্তব্য থেকে তথ্য যোগ করার পদ্ধতি: আপনি না ব্যবহার করতে হবে [
... ]
এই ক্ষেত্রে সিনট্যাক্স। [
নিজেই একটি কমান্ড, প্রায় সমতুল্য test
। এটি সম্ভবত কোনও সর্বাধিক সাধারণ কমান্ড if
যা একটি শেল সিনট্যাক্সের অংশ বলে ধরে নেওয়া যেতে পারে which তবে আপনি যদি কোনও কমান্ড সফল হয়েছে কিনা তা পরীক্ষা করতে চান if
, উপরের মতই কমান্ডটি সরাসরি ব্যবহার করুন ।
সম্পাদনা: স্পষ্টতার জন্য শীর্ষে প্রশ্নের উদ্ধৃতি (এই উত্তরটি পৃষ্ঠার শীর্ষের কাছে উপস্থিত হবে না)।
then
একটি পৃথক লাইনে লাগাতে পারেন ।
if ! command ; then ... ; fi
। [
এটি নিজেই একটি আদেশ, এবং এই ক্ষেত্রে এটির প্রয়োজন নেই।
শেল কমান্ডটি যদি কাজ করে তবে আপনি যে ছোট ছোট জিনিসগুলি ঘটতে চান তা ব্যবহার করতে পারেন &&
:
rm -rf somedir && trace_output "Removed the directory"
একইভাবে শেল কমান্ড ব্যর্থ হলে আপনি যে ছোট ছোট জিনিসগুলি করতে চান তা ব্যবহার করতে পারেন ||
:
rm -rf somedir || exit_on_error "Failed to remove the directory"
অথবা উভয়
rm -rf somedir && trace_output "Removed the directory" || exit_on_error "Failed to remove the directory"
এই নির্মাণগুলির সাথে খুব বেশি কাজ করা বুদ্ধিমানের কাজ, তবে তারা উপলক্ষ্যে নিয়ন্ত্রণের প্রবাহকে আরও পরিষ্কার করে দিতে পারে।
$?
সর্বাধিক সাম্প্রতিক কমান্ড / ফাংশন কার্যকর করার ফলাফল ধারণ করে যার মানটি পরীক্ষা করুন :
#!/bin/bash
echo "this will work"
RESULT=$?
if [ $RESULT -eq 0 ]; then
echo success
else
echo failed
fi
if [ $RESULT == 0 ]; then
echo success 2
else
echo failed 2
fi
if
মূর্তিটি ব্যবহার করছে না । আমি কিথ থম্পসনের উত্তর পছন্দ করি।
if
এটি করা। বাশের প্রবাহ নিয়ন্ত্রণের পরিস্থিতি সমস্ত $?
পর্দার আড়ালে পরীক্ষা করে; তারা কি না। সুস্পষ্টভাবে এর মান পরীক্ষা করা বেশিরভাগ ক্ষেত্রেই অপ্রয়োজনীয় হওয়া উচিত এবং এটি সাধারণত একটি শিক্ষানবিস এন্টিপ্যাটার্ন হয়।
if ! cmd
তবে ভাল। অন্যথায়, একটি সাধারণ ব্যবস্থা হ'ল একটি else
ধারা ব্যবহার করা । আপনার কোনও খালি থাকতে পারে না then
তবে আপনি কখনও কখনও দেখতে পাবেন then : nothing; else
যেখানে কোনও বিকল্প :
নেই তা উল্লেখযোগ্য। true
পাশাপাশি কাজ করবে।
এটি আমার পক্ষে কাজ করেছে:
command && echo "OK" || echo "NOK"
যদি command
সফল হয়, তবে echo "OK"
মৃত্যুদন্ড কার্যকর করা হয় এবং এটি সফল হওয়ায় কার্যকরকরণ সেখানেই থেমে যায়। অন্যথায়, &&
এড়ানো হয় এবং echo "NOK"
কার্যকর করা হয়।
command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
command && echo "OK" || (c=$?; echo "NOK"; (exit $c))
?
echo "OK"
অংশটি নিজেই ব্যর্থ হতে পারে তবে এটি আরও ভাল:command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
এটি লক্ষ করা উচিত যে if...then...fi
এবং &&
/ ||
প্রকারের পদ্ধতির সাথে প্রস্থান স্থিতির সাথে সম্পর্কিত আদেশটি আমরা আদেশ দিয়ে ফিরে এসেছি (সাফল্যে 0); তবে, কমান্ড ব্যর্থ হলে বা ইনপুট নিয়ে কাজ করতে না পারলে কিছু কমান্ড একটি শূন্য-বহির্গমন স্থিতি ফিরিয়ে দেয় না। এর অর্থ হ'ল স্বাভাবিক if
এবং &&
/ ||
পদ্ধতিগুলি সেই নির্দিষ্ট কমান্ডগুলির জন্য কাজ করে না।
উদাহরণস্বরূপ, লিনাক্সে জিএনইউ file
0 দিয়ে এখনও প্রস্থান করে যদি এটি কোনও অস্তিত্বযুক্ত ফাইলকে আর্গুমেন্ট হিসাবে গ্রহণ করে এবং find
নির্দিষ্ট করা ফাইল ব্যবহারকারী সনাক্ত করতে না পারে।
$ find . -name "not_existing_file"
$ echo $?
0
$ file ./not_existing_file
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0
এই ক্ষেত্রে, একটি সম্ভাব্য আমরা যেভাবে পরিস্থিতি হ্যান্ডেল পারে পড়া হয় stderr
/ stdin
বার্তা, যেমন ঐ যে দ্বারা ফিরে file
কমান্ড বা মত কমান্ডের আউটপুট পার্স find
। যে উদ্দেশ্যে, case
বিবৃতি ব্যবহার করা যেতে পারে।
$ file ./doesntexist | while IFS= read -r output; do
> case "$output" in
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed
$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi
File not found
আমি সবচেয়ে ত্রুটিযুক্ত প্রবণতাটি নিয়ে আসতে পারি:
RR=$?
এখন, শুধুমাত্র এই পরিস্থিতির জন্য নয়, আপনি অন্যদের মুখোমুখি হতে পারেন, বিবেচনা করুন:
$ AA=1 ; if (( "10#0${AA}" == 1 )) ; then echo yes ; else echo no ; fi
উত্তর: হ্যাঁ
$ AA=1 ; if (( "10#0${AA}" != 1 )) ; then echo yes ; else echo no ; fi
উত্তর: না
$ AA=1 ; if (( "10#0${BB}" == 1 )) ; then echo yes ; else echo no ; fi
উত্তর: না
$ AA=1 ; if (( "10#0${BB}" != 1 )) ; then echo yes ; else echo no ; fi
উত্তর: হ্যাঁ
$ AA=1 ; if (( "10#0${BB}" == 0 )) ; then echo yes ; else echo no ; fi
উত্তর: হ্যাঁ
এটি সমস্ত ধরণের ত্রুটিগুলি বন্ধ করে দেয়।
আপনি সম্ভবত সমস্ত সিনট্যাক্স সম্পর্কে সচেতন, তবে এখানে কয়েকটি টিপস:
"blank"
হতে একটি এড়ানো nothing
।${variable}
।base-8
। আপনি যেমন একটি ত্রুটি পাবেন:
value too great for base (error token is "08")
উপরের সংখ্যা জন্য 7
। এটি যখন 10#
খেলতে আসে:10#
সংখ্যা হতে বাধ্য করে base-10
।তুমি এটি করতে পারো:
if ($( ping 4.4.4.4 -c1 > /dev/null )) ; then
echo "ping response succsess!!!"
fi
ping
কমান্ড হিসাবে চালানোর দৃষ্টিতে আউটপুট ক্যাপচার করা হয়েছে। তবে আউটপুটটি / dev / নালটিতে পুনঃনির্দেশিত হওয়ার কারণে এটি সর্বদা খালি স্ট্রিং হয়ে থাকবে। সুতরাং আপনি একটি সাব-শেলের কিছুই চালাচ্ছেন না, যার অর্থ পূর্ববর্তী প্রস্থান স্থিতি (কমান্ড সাবস্টিটিউশন সাবশেলের, যে পিংয়ের) বজায় থাকবে। স্পষ্টতই, সঠিক উপায়টি if ping ...; then
এখানে।
এই থ্রেডে অন্য কোথাও উল্লিখিত হিসাবে, মূল প্রশ্নটি মূলত নিজের উত্তর দেয়। এখানে একটি চিত্র দেখানো হচ্ছে যে if
শর্তগুলিও বাসা বেধে থাকতে পারে।
এই উদাহরণটি if
কোনও ফাইল উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে ব্যবহার করে এবং এটি নিয়মিত ফাইল কিনা। যদি এই শর্তগুলি সত্য হয়, তবে এটির আকার 0 এর চেয়ে বড় কিনা তা পরীক্ষা করে দেখুন।
#!/bin/bash
echo "Which error log are you checking today? "
read answer
if [ -f /opt/logs/$answer*.errors ]
then
if [ -s /opt/logs/$answer*.errors ]
then
echo "Content is present in the $answer error log file."
else
echo "No errors are present in the $answer error log file."
fi
else
echo "$answer does not have an error log at this time."
fi
#!/bin/bash
if command-1 ; then
echo "command-1 succeeded and now running from this block command-2"
command-2
else
echo "command-1 failed and now running from this block command-3"
command-3
fi
এটি কেবল এইভাবে করা যেতে পারে কারণ $?
আপনাকে মৃত্যুদন্ড কার্যকর করা শেষ কমান্ডের স্থিতি দেয়।
সুতরাং এটি হতে পারে
#!/bin/sh
... some command ...
if [ $? == 0 ] ; then
echo '<the output message you want to display>'
else
echo '<failure message>'
fi