मैं 'तारीख' के आउटपुट से अग्रणी शून्य कैसे निकालूं या ऐसी दशमलव संख्याओं की अष्टांगिक व्याख्या से बचूं?


37

मेरे पास यह है:

date +"%H hours and %M minutes"

मैं इसे कहने के लिए त्योहार का उपयोग करता हूं .. लेकिन यह कहता है: "शून्य नौ घंटे" .. मैं इसे "नौ घंटे" कहना चाहता हूं!

लेकिन तारीख हमेशा मुझे 09 देते हैं ... तो मुझे आश्चर्य है कि अगर बैश आसानी से सिर्फ 9 बन सकते हैं?

जिस जटिल स्क्रिप्ट में मैंने कोशिश की थी

printf %d 09

लेकिन यह विफल रहता है .. अष्टदल नहीं :(

कोई उपाय?


ओपी, आपका स्वीकृत उत्तर बहुत अच्छा है - आपके विशिष्ट मामले के लिए, लेकिन यह प्रश्न शीर्षक से मेल नहीं खाता है।
ईनपोक्लुम -

@ilkachach पुरानी शीर्षक मुझे इस प्रश्न को खोजने में महत्वपूर्ण था, अष्ट-प्रारूप संख्याओं की दशमलव व्याख्या मजबूर करने के लिए।
मुरु

@ muru, हाँ, मैंने सोचा कि अगर मैं वहाँ अष्टक के बारे में नोट चिपका सकता हूँ, लेकिन एक अच्छा वाक्यांश लेकर नहीं आया। आप इसे बदल सकते हैं, कम से कम आप जानते हैं कि आपने क्या खोजा था? उत्तर और प्रश्न अभी भी मुख्य रूप से अग्रणी शून्य को हटाने के बारे में प्रतीत होते हैं।
इलकाचू

जवाबों:


49
  • आपके मामले में, आप केवल तारीख के प्रारूप स्ट्रिंग के -बाद एपेंड करके शून्य पैडिंग को अक्षम कर सकते हैं %:%-H

    डिफ़ॉल्ट रूप से, तारीख संख्यात्मक फ़ील्ड को शून्यों से पैड कर देती है। निम्नलिखित वैकल्पिक झंडे '%' का अनुसरण कर सकते हैं:

    • - (हाइफ़न) क्षेत्र को पैड न करें
    • _ (अंडरस्कोर) रिक्त स्थान के साथ पैड
    • 0 (शून्य) शून्य के साथ पैड
    • ^ यदि संभव हो तो ऊपरी मामले का उपयोग करें
    • # यदि संभव हो तो विपरीत मामले का उपयोग करें

    तारीख मैनुअल देखें

  • यदि आप अलग आधार में संख्या की व्याख्या करना चाहते हैं, तो बैश में

    • एक अग्रणी 0 के साथ स्थिरांक को अष्टक संख्या के रूप में व्याख्या की जाती है।
    • एक प्रमुख 0x या 0X हेक्साडेसिमल को दर्शाता है।
    • अन्यथा, संख्याएं फार्म [आधार #] n लेती हैं, जहां आधार 2 और 64 के बीच एक दशमलव संख्या है जो अंकगणितीय आधार का प्रतिनिधित्व करता है, और n उस आधार में एक संख्या है

    तो, एक संख्या को दशमलव के रूप में व्याख्या करने के लिए, 10#nफ़ॉर्म का उपयोग करें , जैसे।10#09

    echo $((10#09*2))
    18
    

    बैश मैनुअल के अंकगणितीय मूल्यांकन अनुभाग देखें ।


2
thx, बहुत विस्तृत! Btw, echo $((011)) $((10#011))एक और अच्छा उदाहरण है कि आउटपुट9 11
कुंभ पावर

1
यह नकारात्मक संख्याओं के लिए काम नहीं करता है: lat=048 ; latd=${lat#0} ; echo $((latd-1))काम करता है, लेकिन lat=-048 ; latd=${lat#0} ; echo $((latd-1))नहीं करता है।
लुइस ए। फ्लोरिट

plus=$((10#01))
डॉ। बीको

2

यदि आप दिनांक मानों के साथ दशमलव में तुलना करने की कोशिश कर रहे हैं, तो मुझे यह तरीका बहुत प्रभावी लगता है:

let mymin=$(date '+1%M') ; let mymin=$mymin%100

वह हमेशा दशमलव मान देता है। तो मैं यह कर सकता हूँ:

if [[ $mymin -le 1 ]]; then   # only 0 and 1 are true.

इस तरह से 08 या 09 के साथ कोई समस्या नहीं है। % 100 के बजाय 10% का उपयोग करने से आपको 0 से दस-मिनट की सीमा मिलती है। 9. मुझे निम्नलिखित शून्य मान भी मिलते हैं, बिना प्रमुख शून्य के:

echo "$((10#$(date +%M)))"

2

आंशिक रूप से, आप आसानी 0से एक चर से एक प्रमुख हटा सकते हैं । यह चर अपरिवर्तित छोड़ देता है यदि कोई अग्रणी नहीं है 0

eval $(date +"h=%H m=%M")
h=${h#0}
m=${m#0}
say "$h hours and $m minutes"

Bash, ksh या zsh में, आप किसी भी अग्रणी 0s को हटाने के लिए ksh के अतिरिक्त ग्लोब पैटर्न का उपयोग कर सकते हैं । बैश में, shopt -s extglobपहले दौड़ें । Zsh में, setopt kshglobपहले दौड़ें ।

eval $(date +"h=%H m=%M")
h=${h#+(0)}
m=${m#+(0)}
say "$h hours and $m minutes"

1

सामान्य तौर पर बैश में:

test ${#number} -eq 2 && number=${number#0}

जिसके परिणामस्वरूप

date +"%H %M" | 
{ read hours minutes
hours=${hours#0}
minutes=${minutes#0}
echo "${hours} hours and ${minutes} minutes"; }

या, अलग:

date +"%H hours and %M minutes" | sed -n -e 's/0\([0-9]\)/\1/g' -e p

मुझे आश्चर्य है कि तारीख में उपयुक्त प्रारूप विकल्प नहीं हैं।

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