বাশ ভেরিয়েবলের প্রথম অক্ষরটি কীভাবে পাবেন?


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 >।
gioele

9
এটি প্রথম অক্ষরটি ফিরিয়ে দেয় তবে এটি একটি ওভারকিল এবং সমাধানটি বাইরের ইউটিলিটিগুলির (মাথা) উপর নির্ভর করে। এটি খাঁটি শেল, যা পরিষ্কার।
অটোম্যাথিয়াস

26
উপরের মন্তব্যগুলি দ্বারা নির্দেশিত কারণগুলির জন্য এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয়। আসল উত্তরগুলি নীচে - ${word:0:1}বা ${word::1}
noamtm

পসিক্স কমপ্লায়েন্সের জন্য আপনি করতে পারতেন echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"বা printf '%c' "$X"এগুলি সবই একক বনাম মাল্টি বাইট চরিত্র শেননিগানের অধীন।
ফিকর

দাঁড়াও, head -c nওফফফ, echo "fábio" | head -c 2দেয় f� , সুতরাং এটি আমার অনুমানের সাথে এটি আরও একটি সমস্যা।
ফিকার


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

4
এটি দুর্দান্ত লাগবে তবে আমার পক্ষে কাজ করবে না, 4.3.11 বাশে বা জেএসএসেও নয় 5.0.5
yoniLavi

4
জিএনইউ বাশ v4.3.3.11 এর সাথে, firstঅক্ষরে সেট করা আছে s। আপনি এটি দিয়ে দেখতে পারেন echo $s। যদি এটি আপনার পক্ষে কাজ করে না, এবং আপনি ডিবাগ করতে সহায়তা করতে চান তবে দয়া করে আপনার টাইপ করা কমান্ডগুলি এবং তাদের আউটপুট কপি করে পেস্ট করুন।
অ্যাডাম লিস

4
ধন্যবাদ আদম, আমার খারাপ, এটি আমার জন্য কেন আগে কাজ করেনি তা আমি বুঝতে পারি না, তবে জিএনইউ ব্যাশ, v3.1.0 এ ফিরে গিয়ে আমি চেষ্টা করেছি এমন বেশ কয়েকটি সংস্করণে এটি এখন পুরোপুরি ঠিকঠাক কাজ করে। এখনও zsh এ কাজ করে না, তবে প্রশ্নটিকে "বাশ" ট্যাগ করা হয়েছে, সুতরাং এটি অপ্রাসঙ্গিক।
yoniLavi

অনুসরণ এবং নিশ্চিত করার জন্য ধন্যবাদ! খুশী এটা আপনার জন্য কাজ করে।
অ্যাডাম লিস



2

যেহেতু আপনার sedএখানে ট্যাগ রয়েছে একটি sedউত্তর:

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

যারা উপভোগ করেন তাদের জন্য খেলুন (আমি করি!):

{

  • s: একটি বিকল্প রুটিন শুরু করুন
    • /: প্রতিস্থাপন করতে হবে কি নির্দিষ্ট করা শুরু করুন
    • ^\(.\): গ্রুপ 1 এ প্রথম চরিত্রটি ক্যাপচার করুন
    • .*:, নিশ্চিত হয়ে নিন যে বাকী রেখাটি বিকল্পে থাকবে
    • /: প্রতিস্থাপন নির্দিষ্ট করা শুরু করুন
    • \1: গ্রুপ 1 sertোকান
    • /: বাকি ফেলে দেওয়া হয়;
  • q: প্রস্থান করুন sedসুতরাং যদি অন্য কোনও লাইনের জন্য এই ব্লকটি পুনরাবৃত্তি করে না।

}

ভাল যে মজা ছিল! :)এছাড়াও আপনি ব্যবহার করতে পারেন grepএবং ইত্যাদি কিন্তু যদি আপনি আছেন magick এখনও ভাল সমাধান নিচ হয়। (আমি এটি করতে পসিক্স ভেরিয়েবল প্রসারণটি ব্যবহার করার চেষ্টা করার মতো এক ঘন্টার মতো সময় কাটিয়েছি কিন্তু পারিনি )bash${x:0:1}:(


1

ব্যাশ 4 ব্যবহার করে:

x="test"
read -N 1 var <<< "${x}"
echo "${var}"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.