Bash değişkenindeki ilk harf nasıl elde edilir?


88

$wordBazen bir kelime veya cümle olan bir Bash değişkenim var , örneğin:

word="tiger"

Veya:

word="This is a sentence."

Değişkende bulunan sadece ilk harfe eşit olan yeni bir Bash değişkeni nasıl yapabilirim? Örneğin, yukarıdakiler şöyle olacaktır:

echo $firstletter
t

Veya:

echo $firstletter
T

Yanıtlar:


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

Sorun tanımınızda her "ilk" dediğinizde, headolası bir çözümdür.


8
Lütfen -cPOSIX başlığında herhangi bir seçenek olmadığını unutmayın : < unix.com/man-page/posix/1/head >.
gioele

9
Bu, ilk harfi döndürür, ancak bu bir aşırılıktır ve çözüm, harici yardımcı programlara (kafa) bağlıdır. Bu, daha temiz olan saf kabukta yapılabilir.
automatthias

26
Yukarıdaki yorumlarda belirtilen nedenlerden dolayı bu kabul edilen cevap olmamalıdır. Gerçek cevaplar aşağıdadır - ${word:0:1}veya ${word::1}.
noamtm

POSIX uyumluluğu için bunu yapabilirsiniz echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"ya da printf '%c' "$X"bunların hepsi tek v. Çok baytlı karakter oyunlarına tabidir.
phicr

Bekle, öyle head -c n, whoops. echo "fábio" | head -c 2verir f� , yani bu sanırım bununla ilgili başka bir sorun.
phicr 01


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

1
Bu harika olurdu, ama benim için işe yaramıyor, ne 4.3.11 bash ne de zsh
5.0.5'te

1
GNU bash v4.3.11 firstile harf olarak ayarlanmıştır s. İle görebilirsiniz echo $s. Bu sizin için işe yaramazsa ve hata ayıklama konusunda yardım istiyorsanız, lütfen yazdığınız komutları ve çıktılarını kopyalayıp yapıştırın.
Adam Liss

2
Teşekkürler Adam, benim hatam, neden daha önce benim için işe yaramadığını anlayamıyorum, ama şimdi denediğim birkaç bash sürümünde gayet iyi çalışıyor, GNU bash, v3.1.0'a dönüyoruz. Hala zsh'de çalışmıyor, ancak soru "bash" olarak etiketlendi, bu yüzden bu alakasız.
yoniLavi

Takip ettiğiniz ve onayladığınız için teşekkürler! Senin için çalıştığına sevindim.
Adam Liss



2

sedBurada bir etiketiniz olduğundan bir sedcevap:

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

Bunlardan hoşlananlar için oyun oynayın (Yapıyorum!):

{

  • s: bir ikame rutini başlat
    • /: Neyin değiştirileceğini belirlemeye başlayın
    • ^\(.\): Grup 1'deki ilk karakteri yakala
    • .*:, satırın geri kalanının oyuncu değişikliği yapacağından emin olun
    • /: değiştirmeyi belirtmeye başlayın
    • \1: Grup 1'i ekle
    • /: Gerisi atılır;
  • q: sedEğer varsa bu bloğu diğer satırlar için tekrarlamaması için çıkın .

}

Bu eğlenceliydi! :)Ayrıca kullanabilirsiniz grepvb ama iseniz magick hala imo daha iyi bir çözümdür. (Bunu yapmak için POSIX değişken genişletmesini kullanmaya çalışırken bir saat kadar harcadım ama yapamadım )bash${x:0:1}:(


1

Bash 4'ü kullanma:

x="test"
read -N 1 var <<< "${x}"
echo "${var}"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.