Wie erhalte ich den ersten Buchstaben in einer Bash-Variablen?


85

Ich habe eine Bash-Variable, $worddie manchmal ein Wort oder ein Satz ist, z.

word="tiger"

Oder:

word="This is a sentence."

Wie kann ich eine neue Bash-Variable erstellen, die nur dem ersten Buchstaben in der Variablen entspricht? Zum Beispiel wäre das Obige:

echo $firstletter
t

Oder:

echo $firstletter
T

Antworten:


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

Jedes Mal, wenn Sie in Ihrer Problembeschreibung "zuerst" sagen, headist dies eine wahrscheinliche Lösung.


8
Bitte beachten Sie, dass es -cin POSIX head keine Option gibt : < unix.com/man-page/posix/1/head >.
Gioele

9
Dies gibt zwar den ersten Buchstaben zurück, ist aber ein Overkill, und die Lösung hängt von externen Dienstprogrammen ab (Kopf). Dies kann in einer reinen Schale erfolgen, die sauberer ist.
Automatthias

26
Dies sollte aus den in den obigen Kommentaren genannten Gründen nicht die akzeptierte Antwort sein. Die wirklichen Antworten sind unten - ${word:0:1}oder ${word::1}.
Noamtm

Für die POSIX-Konformität können Sie dies tun echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"oder printf '%c' "$X"diese unterliegen jedoch allen Spielereien mit einem oder mehreren Byte-Zeichen.
Phicr

Warten Sie, so ist head -c n, whoops. echo "fábio" | head -c 2gibt f� , also ist das ein weiteres Problem damit, denke ich.
Phicr


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

1
Das wäre wunderbar, funktioniert aber nicht für mich, weder in Bash 4.3.11 noch in Zsh 5.0.5
YoniLavi

1
Mit GNU bash wird v4.3.11 firstauf den Buchstaben gesetzt s. Sie können es mit sehen echo $s. Wenn dies bei Ihnen nicht funktioniert und Sie Hilfe beim Debuggen benötigen, kopieren Sie die eingegebenen Befehle und deren Ausgabe und fügen Sie sie ein.
Adam Liss

2
Danke Adam, mein Schlechtes, ich kann nicht herausfinden, warum es bei mir vorher nicht funktioniert hat, aber es funktioniert jetzt einwandfrei bei mehreren Versionen von Bash, die ich ausprobiert habe, und gehe zurück zu GNU Bash, Version 3.1.0. Funktioniert immer noch nicht in zsh, aber die Frage ist mit "bash" markiert, das ist also irrelevant.
YoniLavi

Vielen Dank für die Nachverfolgung und Bestätigung! Ich bin froh, dass es für dich funktioniert.
Adam Liss



2

Da Sie ein sedTag haben, ist hier eine sedAntwort:

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

Spiel für Spiel für diejenigen, die diese genießen (das tue ich!):

{

  • s: Starten Sie eine Substitutionsroutine
    • /: Geben Sie an, was ersetzt werden soll
    • ^\(.\): Erfassen Sie das erste Zeichen in Gruppe 1
    • .*:, stellen Sie sicher, dass der Rest der Zeile ersetzt wird
    • /: Geben Sie den Ersatz an
    • \1: Gruppe 1 einfügen
    • /: Der Rest wird verworfen;
  • q: Beenden, seddamit dieser Block nicht für andere Zeilen wiederholt wird, falls vorhanden.

}

Na das war ein Spaß! :)Sie können auch grepund etc verwenden, aber wenn Sie in bashder ${x:0:1}Magie sind, ist immer noch die bessere Lösung imo. (Ich habe ungefähr eine Stunde damit verbracht, die POSIX-Variablenerweiterung zu verwenden, konnte dies aber nicht :( )


1

Mit Bash 4:

x="test"
read -N 1 var <<< "${x}"
echo "${var}"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.