Como obter a primeira letra de uma variável Bash?

88

Eu tenho uma variável Bash,, $wordque às vezes é uma palavra ou frase, por exemplo:

word="tiger"

Ou:

word="This is a sentence."

Como posso criar uma nova variável Bash que seja igual apenas à primeira letra encontrada na variável? Por exemplo, o acima seria:

echo $firstletter
t

Ou:

echo $firstletter
T
Vila
fonte

Respostas:

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

Cada vez que você disser "primeiro" na descrição do problema, headé uma solução provável.

thiton
fonte
8
Observe que não há -copção no cabeçote POSIX: < unix.com/man-page/posix/1/head >.
gioele
9
Isso retorna a primeira letra, mas é um exagero, e a solução depende de utilitários externos (cabeça). Isso pode ser feito em casca pura, que é mais limpa.
automatthias,
26
Esta não deve ser a resposta aceita, pelos motivos apontados nos comentários anteriores. As verdadeiras respostas estão abaixo - ${word:0:1}ou ${word::1}.
noamtm
Para conformidade com POSIX, você pode fazer echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"ou printf '%c' "$X"mas todos estão sujeitos a travessuras de caracteres de byte único v.
phicr 01 de
Espere, então está head -c n, ops. echo "fábio" | head -c 2f� , então esse é outro problema com isso, eu acho.
phicr 01 de
281
word="tiger"
firstletter=${word:0:1}
Karoly Horvath
fonte
9
Exatamente o que eu estava procurando. One-liner, sem gerar subshells. Pegue meu voto!
Tihomir Mitkov
73
word=something
first=${word::1}
Adam Liss
fonte
1
Isso seria maravilhoso, mas não funciona para mim, nem no bash 4.3.11 nem no zsh 5.0.5
yoniLavi
1
Com o GNU bash v4.3.11, firstestá tudo certo s. Você pode ver isso com echo $s. Se isso não funcionar para você e você quiser ajuda na depuração, copie e cole o (s) comando (s) que você digitou e sua saída.
Adam Liss
2
Obrigado Adam, que coisa, não consigo descobrir por que não funcionou para mim antes, mas funciona perfeitamente bem agora em várias versões do bash que experimentei, voltando ao GNU bash, v3.1.0. Ainda não funciona no zsh, mas a questão está marcada como "bash", então isso é irrelevante.
yoniLavi
Obrigado por acompanhar e confirmar! Que bom que está funcionando para você.
Adam Liss
6

Com corte:

word='tiger'
echo "${word}" | cut -c 1
Franckyz
fonte
2

Já que você tem uma sedtag, aqui está uma sedresposta:

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

Jogo a jogo para quem gosta disso (eu gosto!):

{

  • s: iniciar uma rotina de substituição
    • /: Comece especificando o que deve ser substituído
    • ^\(.\): captura o primeiro personagem do Grupo 1
    • .*:, certifique-se de que o resto da linha estará na substituição
    • /: comece especificando a substituição
    • \1: inserir Grupo 1
    • /: O resto é descartado;
  • q: Saia sedpara não repetir este bloco para outras linhas, se houver.

}

Bem, isso foi divertido! :)Você também pode usar grepe etc, mas se você estiver bashna ${x:0:1}magia ainda é a melhor solução imo. (Passei uma hora tentando usar a expansão de variável POSIX para fazer isso, mas não consegui :( )

phicr
fonte
1

Usando o bash 4:

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