আমি সপ্তাহের দিনের উপর ভিত্তি করে কীভাবে একটি ইফ-অন্য কোয়েরি ব্যবহার করব?


10

সমস্যা: আমাকে আজ বৃহস্পতিবার কিনা তা পরীক্ষা করে দেখতে হবে এবং এই শর্তের ফলাফলের ভিত্তিতে বিভিন্ন ক্রিয়া সম্পাদন করা উচিত। আমি দুটি ভিন্ন পদ্ধতির চেষ্টা করেছি:

দিবসটির নাম পাওয়া:

DAYOFWEEK=$(date +"%a")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == "Thu"]; 
then   
   echo YES
else
    echo NO
fi

দিবস স্নাতক

DAYOFWEEK=$(date +"%u")
echo DAYOFWEEK: $DAYOFWEEK

if ["$DAYOFWEEK" == 4]; 
then
   echo YES
else
   echo NO
fi

উভয় ক্ষেত্রেই আউটপুটটি হয় না, যদিও এটি হ্যাঁ হওয়া উচিত। কি সমস্যা?


1
একটি পার্শ্ব নোট: ;আপনার যদি thenএকই লাইনে থাকে তবে সেগুলির প্রয়োজন হবে if। এই ক্ষেত্রে তারা অপ্রয়োজনীয়।
manatwork

উত্তর:


12

সমস্যা হ'ল ফাঁকা

নিম্নলিখিত কোডটি শেলগুলিতে কাজ করবে যার [বিল্টিন কমান্ড ==একটি উপাধিকার হিসাবে গ্রহণ করে =:

if [ "$DAYOFWEEK" == 4 ];  then    echo YES; else    echo NO; fi

কিন্তু মন (দেখুন রাখা help testমধ্যে bash):

  • ==সরকারীভাবে উল্লেখ করা হয় নি, আপনার =স্ট্রিং তুলনা ব্যবহার করা উচিত
  • -eqদশমিক গাণিতিক পরীক্ষার জন্য দেয়ার উদ্দেশ্যে করা হচ্ছে (জন্য একটি পার্থক্য এখানে না করে date +%uকিন্তু would জন্য date +%dউদাহরণস্বরূপ যখন তুলনা আসে 04এবং 4যা সংখ্যাসূচকভাবে একই কিন্তু আভিধানিক ভিন্ন)।

আমি পছন্দ করবো:

 if [ "${DAYOFWEEK}" -eq 4 ];  then    echo YES; else    echo NO; fi

সাধারণত আপনার দিনের সংখ্যা পদ্ধতির পছন্দ করা উচিত , কারণ এটির বর্তমান লোকেলের সাথে কম নির্ভরতা রয়েছে । আমার সিস্টেমে date +"%a"আজকের ফলাফল Do


3

caseএই জাতীয় জিনিসগুলি করার জন্য সবচেয়ে ভাল উপায় কোনটি উপেক্ষা করবেন না :

এছাড়াও সতর্কতা অবলম্বন করুন যে আউটপুটটি date +%aস্থানীয়-নির্ভর is

case $(LC_ALL=C date +%a) in
   (Mon) echo first day of the week;;
   (Thu) do-something;;
   (Sat|Sun) echo week-end;;
   (*) echo any other day;; # last ;; not necessary but doesn't harm
esac

নোট করুন যে উপরেরটি বিরল ক্ষেত্রে এর মধ্যে একটি যেখানে $(...)উদ্ধৃতি দেওয়ার প্রয়োজন নেই (যদিও উদ্ধৃতিগুলি ক্ষতি করবে না in হিসাবে একই var="$(...)")।


0

একই ধারণাটিতে, আমি একটি নির্বাচিত সময়ের আগে ক্রোনকে "অক্ষম" করতে নিম্নলিখিত কোডের টুকরোটি ব্যবহার করি
অবশ্যই, আমি বরং ক্রন্টবকে নিজেই সংশোধন করব ... যদি আমাকে প্রয়োজনীয় অধিকার দেওয়া হয় :)

এখানে একটি সহজ পরীক্ষা যা আমরা রাতে না হলে বাশ স্ক্রিপ্টটি বন্ধ করে দেয়।

# Delay or restrict execution.
# Here, we quit unless hour is greater than (gt) 2 and (-a) lower than (lt) 7
# i.e. execution happens only at 3,4,5&6 o'clock.
if  /usr/bin/test `date '+%H'` -gt 2 -a `date '+%H'` -lt 7; then
  echo LETS_START_PROCESSING;
else
  exit;
fi

#Put job here

/usr/bin/testশেলের বিল্টিন [কমান্ডের পরিবর্তে কেন ব্যবহার করবেন ?
স্টাফেন চেজেলাস

@ স্টাফেন চেজেলাস আমি 3,4,5,6 ব্যবহার করিনি কারণ আমার কাছে ক্রন্টব অ্যাক্সেস নেই। ( এটি আমার পোস্টের ২ য় লাইন ) আমাদের সার্ভারগুলি ক্যারানেট দ্বারা পরিচালিত হয় এবং আমরা ইতিমধ্যে এক সপ্তাহের টিকিট-পিং-পং হারিয়েছি ... একটি কাজের ক্রোন (মজা করছে না)। তাই আমরা যখন ঝামেলা জাগাতে পারি এবং টিকিটগুলি পুনরায় খোলার বিষয়টি এড়াতে পারি :) এই কারণে, আমরা প্রতিদিনের পরিবর্তে একটি ঘন্টার ক্রোন টাস্ক চেয়েছিলাম এবং যতক্ষণ না আমাদের সমস্ত পরীক্ষা শেষ হয়, ততক্ষণ টাস্কটি স্পর্শ না করা সহজ হবে এবং সম্পাদিত স্ক্রিপ্টে আমাদের নিয়ন্ত্রণ যুক্ত করুন।
বাল্মীপুর

আহ ঠিক আছে, দুঃখিত, আমি ভেবেছিলাম আপনার cronব্যবহারকারীর ক্রোনট্যাবের বিপরীতে নির্বাহযোগ্যকে সংশোধন করার অধিকার আপনার নেই ।
স্টাফেন চ্যাজেলাস

@ স্টাফেন চেজেলাস পরীক্ষার বাক্য গঠন সম্পর্কে, আমি এটির চেয়ে বেশি পছন্দ করেছি [] বা [[]] কারণ আমি আমার স্ক্রিপ্টটি অন্য কোনও সার্ভারে চেষ্টা করেছি যেখানে আমি ক্রোনট্যাব ব্যবহার করতে পারি । ক্রোন দিয়ে অনেক বিস্ময়ের পরে, ক্রোনট্যাবগুলিতে যথাসম্ভব নিখুঁত পথটি ব্যবহার করার অভ্যাসটি পেয়েছি। কেউ বলতে পারে যে এটি পরীক্ষাগুলি কুৎসিত করে তোলে, এবং সঠিক হবে ... তবে আমি জবাব দেব যে শেল পরীক্ষা সবসময়ই কুৎসিত হয়, এবং ঠিক ঠিক হবে ^^ আমার কাছে কী গুরুত্বপূর্ণ তার উত্তর ছিল যা উত্তর দিয়ে কাজ করবে mostly সাধারণ অনুলিপি / পেস্ট করুন এবং কিছু ব্যাখ্যা অন্তর্ভুক্ত করুন।
বাল্মীপুর

1
মনে রাখবেন যে এতে -aঅবচয় রয়েছে test। স্ট্যান্ডার্ডভাবে, আপনি ব্যবহার করবেন: hour=$(date +%H); if [ "$hour" -gt 2 ] && [ "$hour" -lt 7 ](বা hour=`date +%H`যদি আপনার বোর্ন শেলের সাথে সামঞ্জস্যপূর্ণ হতে হবে তবে এটি সোলারিস 10 এবং তার চেয়ে বেশি বয়স্ক এবং সম্ভবত আজকাল কিছু বিরল এসসিও ইউনিকেশন রয়েছে)
স্টাফেন

0

সপ্তাহের দিনে স্ক্রিপ্টটি থামাতে, কেবল দিনের লাইনটি মুছুন:

DAYOFWEEK=$(date +"%u")
echo "$DAYOFWEEK";
if [ "$DAYOFWEEK" == 1 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 2 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 3 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 4 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 5 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 6 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 7 ]; then exit; else echo; fi

ইউনিক্স এসই তে স্বাগতম! আমি আপনার প্রথম লাইনটি সঠিকভাবে বুঝতে পেরেছি কিনা তা নিশ্চিত নই। এর if [ "$DAYOFWEEK" -lt 7 ]চেয়ে ভাল হবে না ?
পিটারহ - মনিকা পুনরায় ইনস্টল করুন

-1

প্রথমত আপনার অ্যাসাইনমেন্টটি DAYOFWEEK = "$ (তারিখ +% u)" উদ্ধৃত করা উচিত

এবং আপনার [এবং] বন্ধনীগুলির প্রতিটি পাশে ফাঁকা স্থান থাকা দরকার।

লাইনের শেষে অর্ধ-কোলন অপ্রয়োজনীয়।


1
উদ্ধৃতি প্রয়োজন হয় না।
এইচ-ডির্ক স্মিট

উপর @ এইচ-DirkSchmitt এর মন্তব্য প্রসারিত করার জন্য: কারণ কেন উদ্ধৃত প্রয়োজন নেই যে আউটপুট কোনো খালি জায়গা থাকা হবে না।
একটি সিভিএন

@ মাইকেলকার্জলিং: না - এটির কখনই প্রয়োজন হয় না ;-) উদাহরণটি চেষ্টা করুন:a=$(echo 1 2 3); echo $a;
এইচ।-ডর্ক স্মিট

@ এইচ-ডির্কস্কিমেট a=$(echo "1 2 3"); echo $aডিজিটের মধ্যে একাধিক স্পেস সহ (স্ট্যাক এক্সচেঞ্জ আমাকে এটিকে সাধারণ অনুলিপি এবং পেস্ট তৈরি করতে দেয় না, দুর্ভাগ্যক্রমে)।
একটি সিভিএন

@ মাইকেলKjörling - man bash দেখুন "যদি প্রতিস্থাপনটি ডাবল উদ্ধৃতিতে উপস্থিত হয়, তবে শব্দ বিভাজন এবং পথের নাম প্রসারিত ফলাফলগুলিতে সম্পাদিত হয় না।" সুতরাং এটি প্রশ্নের ক্ষেত্রে এবং "1 2 3" উদাহরণে কোনও পার্থক্য নেই।
এইচ।-ডর্ক স্মিট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.