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
Dorf
quelle

Antworten:

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

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

Thiton
quelle
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
277
word="tiger"
firstletter=${word:0:1}
Karoly Horvath
quelle
9
Genau das, wonach ich gesucht habe. Einzeiler ohne Laichen von Unterschalen. Nimm meine Stimme!
Tihomir Mitkov
71
word=something
first=${word::1}
Adam Liss
quelle
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
5

Mit Schnitt:

word='tiger'
echo "${word}" | cut -c 1
Franckyz
quelle
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 :( )

phicr
quelle
1

Mit Bash 4:

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