2012-04-18 13 views
51

मैं एक बैश चर, $word, जो कभी कभी एक शब्द या वाक्य है, जैसे है परिवर्तनीय में पहला अक्षर मिला? जैसे, ऊपर होगा:बैश वैरिएबल में पहला अक्षर कैसे प्राप्त करें?</p> <pre><code>word="tiger" </code></pre> <p>या::</p> <pre><code>word="This is a sentence." </code></pre> <p>मैं एक नया बैश चर जो केवल के बराबर है कैसे कर सकते हैं

echo $firstletter 
t 

या:

echo $firstletter 
T 

उत्तर

22
initial="$(echo $word | head -c 1)" 

हर बार जब आप कहते हैं कि "पहले" आपकी समस्या वर्णन में, head एक संभावित समाधान है।

+6

कृपया ध्यान दें कि POSIX सिर में कोई '-c' विकल्प नहीं है: । – gioele

+3

यह पहला अक्षर लौटाता है, लेकिन यह एक ओवरकिल है, और समाधान बाहरी उपयोगिताओं (सिर) पर निर्भर करता है। यह शुद्ध खोल में किया जा सकता है, जो क्लीनर है। – automatthias

+10

उपरोक्त टिप्पणियों द्वारा बताए गए कारणों के लिए यह स्वीकार्य उत्तर नहीं होना चाहिए। वास्तविक उत्तर नीचे दिए गए हैं - '$ {शब्द: 0: 1}' या '$ {शब्द :: 1}'। – noamtm

170
word="tiger" 
firstletter=${word:0:1} 
+3

वास्तव में जो मैं ढूंढ रहा था, यह अपेक्षित काम नहीं करेगा। एक-लाइनर, बिना सब्सक्रिप्शन के। मेरा वोट लो! –

58
word=something 
first=${word::1} 
+1

यह बहुत अच्छा होगा, लेकिन मेरे लिए काम नहीं करता है, न तो 4.3.11 में और न ही zsh 5.0.5 – yoniLavi

+1

में जीएनयू बैश v4.3.11 के साथ, 'पहला' अक्षर' पर सेट है। आप इसे 'echo $ s' के साथ देख सकते हैं। यदि यह आपके लिए काम नहीं करता है, और आप डिबगिंग में सहायता करना चाहते हैं, तो कृपया आपके द्वारा टाइप किए गए आदेश (ओं) को कॉपी और पेस्ट करें। –

+1

धन्यवाद एडम, मेरे बुरे, मैं यह नहीं समझ सकता कि यह मेरे लिए पहले क्यों काम नहीं करता था, लेकिन यह बैश के कई संस्करणों पर अब पूरी तरह से ठीक काम करता है, जीएनयू बैश, v3.1.0 पर वापस जा रहा है। अभी भी zsh में काम नहीं करता है, लेकिन सवाल "बैश" टैग किया गया है, इसलिए यह अप्रासंगिक है। – yoniLavi

1

चूंकि आप एक sed टैग के लिए यहां एक sed जवाब है: खेल से

echo "$word" | sed -e "{ s/^\(.\).*/\1/ ; q }" 

प्ले जो लोग उन का आनंद के लिए (मैं करता हूँ!):

{

  • s: एक प्रतिस्थापन दिनचर्या शुरू
    • /: निर्दिष्ट करने क्या
    • ^\(.\) प्रतिस्थापित किया जा रहा है शुरू करें: समूह 1 में पहले वर्ण पर कब्जा
    • .*:, यकीन है कि लाइन के बाकी प्रतिस्थापन में होगा बनाने के
    • /: सम्मिलित समूह 1
    • : प्रतिस्थापन
    • \1 निर्दिष्ट करने शुरू: बाकी ;
  • q त्याग दिया जाता है: छोड़ो sed तो यह इस ब्लॉक अन्य लाइनों के लिए यदि कोई हो तो दोहराना नहीं होगा।

}

खैर मजेदार था कि! :) आप grep और आदि का भी उपयोग कर सकते हैं, लेकिन यदि आप bash में हैं ${x:0:1} मैजिक अभी भी बेहतर समाधान आईएमओ है।(मैं एक घंटे POSIX चर विस्तार उपयोग करने के लिए ऐसा करने की कोशिश की तरह बिताया लेकिन सकता है नहीं :()

+0

मैंने यहां एक पॉज़िक्स समाधान पोस्ट किया: https://stackoverflow.com/a/44988512/4694621 –

0

बैश 4 का उपयोग करना:

x="test" 
read -N 1 var <<< "${x}" 
echo "${var}" 
संबंधित मुद्दे