2012-04-18 23 views
51

mam zmienną Bash, $word, który jest czasami słowo lub zdanie, np:Jak uzyskać pierwszą literę w zmiennej Bash?

word="tiger" 

Lub:

word="This is a sentence." 

Jak mogę dokonać nowego bash zmienną, która jest równa tylko pierwsza litera znaleziona w zmiennej? Na przykład, powyższa będzie:

echo $firstletter 
t 

czyli

echo $firstletter 
T 

Odpowiedz

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

każdym razem, kiedy powiedzieć "pierwszy" w opisie problemu, head jest prawdopodobne rozwiązanie.

+6

Należy pamiętać, że w POSIX head nie ma opcji '-c': . – gioele

+3

To zwraca pierwszą literę, ale jest przesadą, a rozwiązanie zależy od zewnętrznych narzędzi (głowa). Można to zrobić w czystej powłoce, która jest czystsza. – automatthias

+10

To nie powinna być przyjęta odpowiedź, z powodów wskazanych powyżej. Prawdziwe odpowiedzi znajdują się poniżej - '$ {word: 0: 1}' lub '$ {word :: 1}'. – noamtm

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

Dokładnie tego, czego szukałem. One-liner, bez spawnych podpowłok. Weźcie mój głos! –

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

To byłoby wspaniałe, ale nie działa dla mnie, ani w bashu 4.3.11, ani w zsh 5.0.5 – yoniLavi

+1

Z GNU bash v4.3.11, "pierwszy" jest ustawiony na literę 's'. Możesz go zobaczyć za pomocą 'echo $ s'. Jeśli to nie działa, a chcesz pomóc w debugowaniu, skopiuj i wklej polecenia, które wpisałeś, i ich wyniki. –

+1

Dzięki Adam, mój zły, nie mogę się domyślić, dlaczego to nie działało wcześniej, ale teraz działa idealnie dobrze na kilku wersjach basha, które próbowałem, wracając do GNU bash, v3.1.0. Nadal nie działa w zsh, ale pytanie jest oznaczone jako "bash", więc nie ma to znaczenia. – yoniLavi

1

Skoro masz sed tag o to sed odpowiedź:

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

play przez grę dla tych, którzy korzystają z tych (ja!):

{

  • s: start podstawienie rutynowe
    • /: Start określające, co ma być podstawiony
    • ^\(.\): uchwycić pierwszy znak w grupie 1
    • .*: upewnij się, że reszta linii będzie w substytucji
    • /: start określając zastąpienie
    • \1: insert Grupa 1
    • /: Reszta jest odrzucana ;
  • q: Quit sed więc nie będę powtarzać tego bloku na innych liniach, jeśli takie istnieją.

}

Dobrze, że była zabawa! :) Możesz także użyć grep i itp., Ale jeśli jesteś w bash, magia wciąż jest lepszym imo.(Jak spędziłem godziny próbuje użyć zmiennej POSIX ekspansję tego robić, ale może nie :()

+0

Umieściłem rozwiązanie POSIX tutaj: https://stackoverflow.com/a/44988512/4694621 –

0

Korzystanie bash 4:

x="test" 
read -N 1 var <<< "${x}" 
echo "${var}"