बैश वैरिएबल में पहला अक्षर कैसे प्राप्त करें?


88

मेरे पास एक बैश चर है, $wordजो कभी-कभी एक शब्द या वाक्य होता है, जैसे:

word="tiger"

या:

word="This is a sentence."

मैं एक नया बैश वेरिएबल कैसे बना सकता हूं जो कि वेरिएबल में पाए जाने वाले पहले अक्षर के बराबर है? जैसे, ऊपर होगा:

echo $firstletter
t

या:

echo $firstletter
T

जवाबों:


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

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


8
कृपया ध्यान दें कि -cPOSIX हेड में कोई विकल्प नहीं है : < unix.com/man-page/posix/1/head >।
जियोले

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

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

POSIX अनुपालन के लिए आप कर सकते हैं echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"या printf '%c' "$X"लेकिन ये सभी एकल v। बहु बाइट चरित्र shenanigans के अधीन हैं।
फिक्र

रुको, तो है head -c n, वूप्स। echo "fábio" | head -c 2देता है f� , ताकि इस मुझे लगता है के साथ एक और समस्या है।
फिक्र


73
word=something
first=${word::1}

1
यह अद्भुत होगा, लेकिन मेरे लिए काम नहीं करता, न तो 4.3.11 में और न ही zsh 5.0.5 में
yoniLavi

1
GNU बैश v4.3.11 के साथ, firstपत्र पर सेट किया गया है s। आप इसे देख सकते हैं echo $s। यदि वह आपके लिए काम नहीं करता है, और आप डिबगिंग में मदद करना चाहते हैं, तो कृपया टाइप किए गए कमांड और उनके आउटपुट को कॉपी करें और पेस्ट करें।
एडम लिस

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

अनुवर्ती और पुष्टि करने के लिए धन्यवाद! खुशी है कि यह आपके लिए काम कर रहा है।
एडम लिस



2

जब से तुम sedयहाँ एक टैग है एक sedजवाब है:

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

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

{

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

}

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


1

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

x="test"
read -N 1 var <<< "${x}"
echo "${var}"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.