2010-04-16 1 views
11

में प्रत्येक दिन के माध्यम से विशिष्ट दिनांक और लूप के साथ शुरू मैं हर अगले दिन के माध्यम से एक दिन के साथ पाश शुरू करने और फिर% Y_% m_dबैश खोल तारीख पार्स, महीने

के रूप में है कि उत्पादन स्वरूपण एक bash खोल स्क्रिप्ट बनाने की जरूरत मुझे लगता है कि मैं एक दिन शुरू कर सकता हूं और फिर दिनों की संख्या के लिए एक और परम जमा कर सकता हूं।

मेरा मुद्दा/प्रश्न यह है कि DATE को सेट कैसे करें (अब नहीं है) और फिर एक दिन जोड़ें।

तो मेरे इनपुट होगा 2010_04_01 6

मेरी उत्पादन होगा

2010_04_01 
2010_04_02 
2010_04_03 
2010_04_04 
2010_04_05 
2010_04_06 

उत्तर

19
[[email protected] ~]$ cat a.sh 
#!/bin/bash 

START=`echo $1 | tr -d _`; 

for ((c=0; c<$2; c++)) 
do 
    echo -n "`date --date="$START +$c day" +%Y_%m_%d` "; 
done 

अब अगर आप अपने पैरामीटर वाला इस स्क्रिप्ट फोन वापस कर देंगे कि तुम क्या चाहते थे:

[[email protected] ~]$ ./a.sh 2010_04_01 6 
2010_04_01 2010_04_02 2010_04_03 2010_04_04 2010_04_05 2010_04_06 
2
#!/bin/bash 
inputdate="${1//_/-}" # change underscores into dashes 
for ((i=0; i<$2; i++)) 
do 
    date -d "$inputdate + $i day" "+%Y_%m_%d" 
done 
0

आप एक से अधिक इनपुट स्वरूपों से निपटने -d जीएनयू तारीख करने के लिए कमांड लाइन विकल्प के माध्यम से एक तिथि पारित कर सकते हैं:

http://www.gnu.org/software/coreutils/manual/coreutils.html#Date-input-formats

कमांड लाइन तर्क या वर्तमान दिनांक का उपयोग के रूप में 10

दर्रा शुरू करने की तारीख:

underscore_date=${1:-$(date +%y_%m_%d)} 
date=${underscore_date//_/-} 

for days in $(seq 0 6);do 
    date -d "$date + $days days" +%Y_%m_%d; 
done 
-1

आप उपयोग कर सकते हैं घूर रहा

#!/bin/bash 

DATE=$1 
num=$2 
awk -vd="$DATE" -vn="$num" 'BEGIN{ 
    m=split(d,D,"_") 
    t=mktime(D[1]" "D[2]" "D[3]" 00 00 00") 
    print d 
    for(i=1;i<=n;i++){ 
     t+=86400 
     print strftime("%Y_%m_%d",t) 
    } 
}' 

उत्पादन

012,
$ ./shell.sh 2010_04_01 6 
2010_04_01 
2010_04_02 
2010_04_03 
2010_04_04 
2010_04_05 
2010_04_06 
2010_04_07 
1

बहुत मूल बैश स्क्रिप्ट ऐसा करने में सक्षम होना चाहिए।

स्क्रिप्ट:
#/bin/bash

प्रारंभ_तिथि = 20,100,501
NUM_DAYS = 5
मैं के लिए seq 1 $num_days
में क्या
    तारीख = date +%Y/%m/%d -d "${start_date}-${i} days"
    गूंज $ तिथि # हालांकि आप इसका इस्तेमाल करें!
किया

आउटपुट:
2010/04/30
2010/04/29
2010/04/28
2010/04/27
2010/04/26

+0

ऊपर स्क्रिप्ट में के लिए '1' के बजाय अपने मामले में '0' से अनुक्रम शुरू करते हैं। – anonymous

+0

यह भी ध्यान दें कि एचटीएमएल बनाने के कारण टिल्ड "" "गायब हो गए (छायांकित हिस्सों से)। – anonymous

10

बहुत मूल बैश स्क्रिप्ट यह करने में सक्षम होना चाहिए:

आउटपुट:
2010/04/30
2010/04/29
2010/04/28
2010/04/27
2010/04/26

+0

बहुत बढ़िया! वास्तव में चालाक समाधान – ToinoBiclas

+1

यह केवल 1..30 के लिए काम करेगा। यदि आपको एक से अधिक महीनों के लिए पुन: प्रयास करने की आवश्यकता है, तो इस समाधान से काम नहीं होगा। – Marcel

6

नोट: से कोई भी समाधान यहाँ ओएस एक्स आप की आवश्यकता होगी, उदाहरण के लिए, कुछ इस तरह के साथ काम करेंगे:

तारीख -v-1d +% Y% m% d

है कि आप के लिए कल का प्रिंट आउट होगा। या फिर निश्चित रूप से अंडरस्कोर द्वारा:

तारीख -v-1d +% Y_% M_% d

तो खाते में है कि ले रही है, आप के बजाय इस आदेश के साथ इन उदाहरणों में छोरों के कुछ समायोजित करने के लिए सक्षम होना चाहिए। -v विकल्प आपको आसानी से दिन, मिनट, सेकंड, साल, महीने इत्यादि जोड़ने या घटाने की अनुमति देगा -v + 24d 24 दिनों को जोड़ देगा। और इसी तरह।

1

आप भी, कैलोरी उपयोग कर सकते हैं उदाहरण के

YYYY=2014; MM=02; for d in $(cal $MM $YYYY | grep "^ *[0-9]"); do DD=$(printf "%02d" $d); echo $YYYY$MM$DD; done 

(मूल रूप से here on my commandlinefu account पोस्ट)