स्क्रिप्ट में चर के रूप में रिक्त स्थान के साथ दिनांक आउटपुट को कैसे प्रारूपित करें?


13

मैं dateइस तरह से अच्छी फॉर्मेटिंग के साथ कमांड बनाना चाहता हूं :

$ date +"%Y-%m-%d %H:%M:%S"
2015-09-17 16:51:58

लेकिन मैं इसे वेरिएबल में सेव करना चाहता हूं, इसलिए मैं स्क्रिप्ट से इस तरह कॉल कर सकता हूं: echo "$(nice_date) [WARNING] etc etc"

हालाँकि यह काम नहीं करता है

$ nice_date="date +%Y-%m-%d %H:%M:%S"
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S
Try 'date --help' for more information.

$ nice_date="date +\"%Y-%m-%d %H:%M:%S\""
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S"’
Try 'date --help' for more information.

$ nice_date='date +"%Y-%m-%d %H:%M:%S"'
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S"
Try 'date --help' for more information.

ऐसा करने का सही तरीका क्या है, ताकि एक सही तर्क प्राप्त करने के लिए उस तारीख को आदेश दिया जाए?


एक साइड नोट के रूप में, "%F %T"यदि आप GNU का उपयोग कर रहे हैं , तो आपके दिनांक प्रारूप स्ट्रिंग को छोटा किया जा सकता है date
जोर्डनम

समस्या का स्थान है। यदि आप उपयोग करते हैं nice_date="date +%Y-%m-%d-%H:%M:%S", तो यह काम करता है। मैं वर्तमान में यह नहीं देख सकता कि दूसरे शेल से उस स्थान को कैसे सुरक्षित किया जाए।
MadHatter

जवाबों:


13

जिस तरह से आपके उदाहरण के विफल होने का कारण है कि शेल का शब्द विभाजन कार्य करता है। जब आप चलाते हैं "$($nice_date)", तो शेल dateकमांड को दो तर्कों के साथ निष्पादित कर रहा है, "+%Y-%m-%d"और "%H:%M:%S"। यह विफल रहता है क्योंकि दिनांक के लिए स्वरूप स्ट्रिंग एक ही तर्क होना चाहिए।

ऐसा करने का सबसे अच्छा तरीका है कि कमांड को वेरिएबल में स्टोर करने के बजाय फंक्शन का उपयोग करें:

format_date() {
  # echo is not needed
  date "+%Y-%m-%d %H:%M:%S" "$1"
}
format_date
format_date "2015-09-17 16:51:58"
echo "$(format_date) [WARNING] etc etc"

यदि आप वास्तव में कमांड को एक चर में संग्रहीत करना चाहते हैं, तो आप एक सरणी का उपयोग कर सकते हैं:

nice_date=(date "+%Y-%m-%d %H:%M:%S")
# again echo not needed
"${nice_date[@]}" "2015-09-17 16:51:58"

एक चर में एक कमांड स्टोर करने के जटिल मामलों पर अधिक जानकारी के लिए, BashFAQ 050 देखें ।


धन्यवाद, लेकिन मैं उत्सुक हूं कि मेरा दृष्टिकोण काम क्यों नहीं कर रहा है, क्या आप उस पर विस्तार कर सकते हैं?
गिल्बर्टस्म

@gilbertasm जवाब अपडेट हुआ
जोर्डनम

1
मैं date: extra operand ‘’ऊपर दोनों दृष्टिकोणों के साथ त्रुटियां कर रहा हूं
जेफ पकेट

3

मैं मानता हूं कि एक समारोह सबसे अच्छा तरीका है। एक विकल्प के रूप में प्रारूप को केवल पूरे कमांड के बजाय एक चर के रूप में संग्रहीत करें:

$ nice_date='+%Y-%m-%d %H:%M:%S'
$ echo "$(date "$nice_date") [WARNING] etc etc"

1
@ कुसलानंद: बिल्कुल सही। धन्यवाद! उत्तर का अद्यतन किया है
एडम

और, उम, माफ करना, लेकिन echoऔर कमांड प्रतिस्थापन भी सतही हैं।
कुसलानंद

1
हां, वे मेरे द्वारा उपयोग किए गए कट-डाउन उदाहरण में तकनीकी रूप से बहुत ही कम थे (मैं तर्क कर सकता था कि वे अधिक पठनीय कोड का उत्पादन कर सकते हैं लेकिन यह स्वाद का सवाल है)। ओपी से उदाहरण का उपयोग करने के लिए अद्यतन किया गया है, जिस स्थिति में उन्हें आवश्यक है
एडम

हां, वह उदाहरण अधिक समझ में आता है।
Kusalananda

1

सबसे छोटा जवाब है

#if you want to store in a variable
now=$(date '+%F" "%T');
echo $now

#or direct output (single quote may not needed)
date '+%F" "%T'

1

एक आसान तरीका सिर्फ एक \ 'के साथ अंतरिक्ष से बच' है

nice_date="date +%Y-%m-%d\ %H:%M:%S"

0

कृपया नीचे देखें:

आपको प्रतीक "` "को जोड़ने की जरूरत है जो प्रतीक कीबोर्ड में टिल्ड की पर है। प्रतीक कहता है कि शेल पहले कमांड को निष्पादित करता है और फिर वेरिएबल को असाइन करता है।

[root@RHEL01 ~]# My_Var=`date +"%Y-%m-%d %H:%M:%S"`
[root@RHEL01 ~]# echo $My_Var
2015-09-17 10:05:30
[root@RHEL01 ~]#

इयान के जवाब के रूप में एक ही समस्या।
14

0

के बजाय:

nice_date="date +%Y-%m-%d %H:%M:%S"
echo "$($nice_date)"

प्रयत्न:

nice_date_format="+%Y-%m-%d %H:%M:%S"
echo $(date "$nice_date_format")

इसके अलावा, आपको अंतिम कमांड प्रतिस्थापन की आवश्यकता नहीं है:

date "$nice_date_format"

-1

एक ही समस्या थी; स्पंक द्वारा प्रसंस्करण के लिए एक अजीब प्रिंट में तारीख डालनी थी। मैंनें इस्तेमाल किया

DATE1=`date +%Y-%m-%d`

DATE2=`date +%T`

फिर

awk ' { print "['$DATE1' '$DATE2'] topic=" $1, etc

1
क्या आप वास्तव में समझा सकते हैं कि यह प्रश्न का उत्तर कैसे देता है?
जी-मैन का कहना है कि 'मोनिका' बहाल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.