Comment obtenir la première lettre d'une variable Bash?

88

J'ai une variable Bash,, $wordqui est parfois un mot ou une phrase, par exemple:

word="tiger"

Ou:

word="This is a sentence."

Comment puis-je créer une nouvelle variable Bash qui n'est égale qu'à la première lettre trouvée dans la variable? Par exemple, ce qui précède serait:

echo $firstletter
t

Ou:

echo $firstletter
T
Village
la source

Réponses:

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

Chaque fois que vous dites «d'abord» dans la description de votre problème, headune solution est probable.

thiton
la source
8
Veuillez noter qu'il n'y a pas d' -coption dans POSIX head: < unix.com/man-page/posix/1/head >.
gioele
9
Cela renvoie la première lettre, mais c'est exagéré, et la solution dépend des utilitaires externes (head). Cela peut être fait dans une coque pure, qui est plus propre.
automatthias
26
Cela ne devrait pas être la réponse acceptée, pour les raisons indiquées par les commentaires ci-dessus. Les vraies réponses sont ci-dessous - ${word:0:1}ou ${word::1}.
noamtm
Pour la conformité POSIX, vous pouvez le faire echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"ou printf '%c' "$X"mais ceux-ci sont tous soumis à des manigances de caractères à un ou plusieurs octets.
phicr
Attendez, oui head -c n, oups. echo "fábio" | head -c 2donne f� , donc c'est un autre problème avec cela, je suppose.
phicr
281
word="tiger"
firstletter=${word:0:1}
Karoly Horvath
la source
9
Exactement ce que je cherchais. Une ligne, sans sous-coquilles de frai. Prends mon vote!
Tihomir Mitkov
73
word=something
first=${word::1}
Adam Liss
la source
1
Ce serait merveilleux, mais ne fonctionne pas pour moi, ni dans bash 4.3.11 ni dans zsh 5.0.5
yoniLavi
1
Avec GNU bash v4.3.11, firstest mis à la lettre s. Vous pouvez le voir avec echo $s. Si cela ne fonctionne pas pour vous et que vous souhaitez obtenir de l'aide pour le débogage, copiez et collez la ou les commandes que vous avez tapées et leur sortie.
Adam Liss
2
Merci Adam, mon mauvais, je ne peux pas comprendre pourquoi cela n'a pas fonctionné pour moi avant, mais cela fonctionne parfaitement bien maintenant sur plusieurs versions de bash que j'ai essayées, pour revenir à GNU bash, v3.1.0. Ne fonctionne toujours pas dans zsh, mais la question est étiquetée "bash", donc ce n'est pas pertinent.
yoniLavi
Merci pour le suivi et la confirmation! Heureux que cela fonctionne pour vous.
Adam Liss le
6

Avec coupe:

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

Puisque vous avez une sedbalise, voici une sedréponse:

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

Jouez par jeu pour ceux qui aiment ceux-là (je le fais!):

{

  • s: démarrer une routine de substitution
    • /: Commencez à spécifier ce qui doit être remplacé
    • ^\(.\): capturez le premier personnage du groupe 1
    • .*:, assurez-vous que le reste de la ligne sera dans la substitution
    • /: commencez à spécifier le remplacement
    • \1: insérer le groupe 1
    • /: Le reste est rejeté;
  • q: Quittez sedpour qu'il ne répète pas ce bloc pour les autres lignes s'il y en a.

}

Eh bien, c'était amusant! :)Vous pouvez également utiliser grepet etc, mais si vous êtes dans bashla ${x:0:1}magie, c'est toujours la meilleure solution imo. (J'ai passé environ une heure à essayer d'utiliser l'extension de variable POSIX pour le faire, mais je n'ai pas pu :( )

phicr
la source
1

Utilisation de bash 4:

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