सप्ताह के दिन के आधार पर मैं एक-इलस क्वेरी का उपयोग कैसे करूं?


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

दोनों मामलों में, आउटपुट NO है, भले ही यह YES होना चाहिए। गलत क्या है?


1
एक साइड नोट: ;यदि आपके पास thenएक ही पंक्ति में होगा, तो वे आवश्यक होंगे if। इस मामले में वे बेमानी हैं।
मैनटवर्क

जवाबों:


12

समस्या गायब रिक्त है।

निम्न कोड गोले में काम करेगा जिसका [अंतर्निहित आदेश इसके ==लिए एक उपनाम के रूप में स्वीकार करता है =:

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

लेकिन ध्यान (देखें में रखने help testमें bash):

  • ==आधिकारिक तौर पर उल्लेख नहीं किया गया है, आपको =स्ट्रिंग तुलना के लिए उपयोग करना चाहिए
  • -eqदशमलव अंकगणितीय परीक्षणों के लिए अभिप्रेत है ( तुलना के लिए यहाँ कोई फर्क नहीं पड़ेगा, date +%uलेकिन date +%dउदाहरण के लिए जब यह तुलना करने के लिए आता है 04और 4जो संख्यात्मक रूप से एक ही हैं लेकिन लेक्सिक रूप से भिन्न हैं)।

मैं चाहूंगा की:

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

आम तौर पर आपको दिन की संख्या के दृष्टिकोण को पसंद करना चाहिए , क्योंकि इसमें वर्तमान स्थान के लिए कम निर्भरता है । मेरे सिस्टम पर date +"%a"आज का आउटपुट है Do


3

नजरअंदाज न करें caseजो अक्सर बातें इस तरह का करने के लिए एक बेहतर तरीका है:

यह भी सावधान रहें कि आउटपुट date +%aस्थानीय-निर्भर है, इसलिए यदि आप अंग्रेजी नामों की अपेक्षा करते हैं, तो उदाहरण के लिए किसी फ्रांसीसी या कोरियाई उपयोगकर्ता द्वारा बुलाए जाने पर आपकी स्क्रिप्ट काम करना बंद कर देगी।

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

ध्यान दें कि उपरोक्त दुर्लभ मामलों में से एक है, जहां $(...)उद्धृत करने की आवश्यकता नहीं है (हालांकि उद्धरण नुकसान नहीं पहुंचाएंगे। उसी रूप में 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उपयोगकर्ता के क्रैटाब के विपरीत निष्पादन योग्य को संशोधित करने का अधिकार नहीं था ।
स्टीफन चेज़ेलस

@ Stéphane Chazelas टेस्ट सिंटैक्स के बारे में, मैंने इसे [] या [[]] पर प्राथमिकता दी क्योंकि मैंने अपनी स्क्रिप्ट को पहले किसी अन्य सर्वर पर आज़माया था, जहाँ मैं crontab का उपयोग कर सकता था । क्रोन के साथ बहुत सारे आश्चर्य के बाद, मुझे यथासंभव कंट्रैब्स में पूर्ण पथ का उपयोग करने की आदत मिली। कोई कह सकता है कि यह परीक्षण को बदसूरत बनाता है, और सही होगा ... लेकिन मैं जवाब दूंगा कि शेल परीक्षण हमेशा वैसे भी बदसूरत होते हैं , और सही भी होंगे ^ ^ मेरे लिए क्या मायने रखती है ज्यादातर एक जवाब था जो एक के साथ काम करेगा सरल कॉपी / पेस्ट, और कुछ स्पष्टीकरण शामिल हैं।
बाल्मीपोर

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
उद्धरण की आवश्यकता नहीं है।
एच।-डर्क श्मिट

@ H.-DirkSchmitt की टिप्पणी पर विस्तार करने के लिए: जिस कारण से उद्धरण की आवश्यकता नहीं है, वह यह है कि आउटपुट में कोई स्थान नहीं होगा।
15

@ माइकलकॉर्जलिंग: नहीं - इसकी कभी जरूरत नहीं है; ;-) उदाहरण के लिए प्रयास करें:a=$(echo 1 2 3); echo $a;
-डिर्क श्मित

@ H.-DirkSchmitt a=$(echo "1 2 3"); echo $aअंकों के बीच कई रिक्त स्थान के साथ (StackExchange मुझे यह एक सरल कॉपी-और-पेस्ट करने नहीं देगा, दुर्भाग्य से)।
एक सीवी

@ माइकलकॉर्जलिंग - देखें मैन बैश "यदि प्रतिस्थापन दोहरे उद्धरण चिह्नों के भीतर दिखाई देता है, तो शब्द विभाजन और पथनाम विस्तार परिणामों पर नहीं किया जाता है।" तो यह सवाल के मामले में बनाता है और "1 2 3" उदाहरण में कोई अंतर नहीं है।
एच।-डर्क Schmitt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.