¿Cómo obtener la primera letra en una variable Bash?

88

Tengo una variable Bash $word, que a veces es una palabra u oración, por ejemplo:

word="tiger"

O:

word="This is a sentence."

¿Cómo puedo hacer una nueva variable Bash que sea igual a solo la primera letra que se encuentra en la variable? Por ejemplo, lo anterior sería:

echo $firstletter
t

O:

echo $firstletter
T
Pueblo
fuente

Respuestas:

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

Cada vez que dice "primero" en la descripción de su problema, heades una solución probable.

thiton
fuente
8
Tenga en cuenta que no hay ninguna -copción en el encabezado POSIX: < unix.com/man-page/posix/1/head >.
gioele
9
Esto devuelve la primera letra, pero es una exageración y la solución depende de las utilidades externas (jefe). Esto se puede hacer en cáscara pura, que es más limpia.
autómatas
26
Esta no debe ser la respuesta aceptada, por las razones señaladas en los comentarios anteriores. Las respuestas reales están debajo - ${word:0:1}o ${word::1}.
noamtm
Para compatibilidad POSIX que podría hacer echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"o printf '%c' "$X"pero estos son todos sujetos a una sola v. Chanchullos varios caracteres de bytes.
phicr
Espera, también lo es head -c n, ¡Ups! echo "fábio" | head -c 2da f� , entonces ese es otro problema con esto, supongo.
phicr
281
word="tiger"
firstletter=${word:0:1}
Karoly Horvath
fuente
9
Exactamente lo que estaba buscando. De una sola línea, sin subcapas de desove. ¡Toma mi voto!
Tihomir Mitkov
73
word=something
first=${word::1}
Adam Liss
fuente
1
Esto sería maravilloso, pero no funciona para mí, ni en bash 4.3.11 ni en zsh 5.0.5
yoniLavi
1
Con GNU bash v4.3.11, firstse ajusta a la letra s. Puedes verlo con echo $s. Si eso no funciona para usted y desea ayuda con la depuración, copie y pegue los comandos que escribió y su salida.
Adam Liss
2
Gracias Adam, mi culpa, no puedo entender por qué no me funcionó antes, pero ahora funciona perfectamente bien en varias versiones de bash que probé, volviendo a GNU bash, v3.1.0. Todavía no funciona en zsh, pero la pregunta está etiquetada como "bash", así que eso es irrelevante.
yoniLavi
¡Gracias por hacer un seguimiento y confirmar! Me alegro de que esté funcionando para ti.
Adam Liss
6

Con corte:

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

Dado que tiene una sedetiqueta, aquí hay una sedrespuesta:

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

Juego a juego para los que disfrutan (¡yo sí!):

{

  • s: inicia una rutina de sustitución
    • /: Empiece a especificar qué se va a sustituir
    • ^\(.\): captura el primer personaje del Grupo 1
    • .*:, asegúrese de que el resto de la línea estará en la sustitución
    • /: comience a especificar el reemplazo
    • \1: insertar Grupo 1
    • /: El resto se descarta;
  • q: Salga sedpara que no se repita este bloque para otras líneas si las hay.

}

¡Bueno eso fue divertido! :)También puede usar grepy etc., pero si está en bashla ${x:0:1}magia, es la mejor solución en mi opinión. (Pasé como una hora tratando de usar la expansión de variables POSIX para hacer eso, pero no pude :( )

phicr
fuente
1

Usando bash 4:

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