it-swarm.com.de

Wie bekomme ich das letzte Zeichen eines Strings in einer Shell?

Ich habe die folgenden Zeilen geschrieben, um das letzte Zeichen einer Zeichenfolge zu erhalten:

str=$1
i=$((${#str}-1))
echo ${str:$i:1}

Es funktioniert für abcd/:

$ bash last_ch.sh abcd/
/

Es funktioniert nicht für abcd*:

$ bash last_ch.sh abcd*
array.sh assign.sh date.sh dict.sh full_path.sh last_ch.sh

Es listet die Dateien im aktuellen Ordner auf.

107
thinker3

Das ist einer der Gründe, warum Sie Ihre Variablen zitieren müssen:

echo "${str:$i:1}"

Andernfalls erweitert bash die Variable und führt in diesem Fall vor dem Ausdruck ein Globbing durch. Es ist auch besser, den Parameter im Skript in Anführungszeichen zu setzen (falls Sie einen passenden Dateinamen haben):

sh lash_ch.sh 'abcde*'

Siehe auch die Reihenfolge der Erweiterungen im Bash-Referenzhandbuch . Variablen werden vor der Dateinamenerweiterung erweitert.

Um das letzte Zeichen zu erhalten, verwenden Sie einfach -1 als Index, da die negativen Indizes vom Ende der Zeichenfolge an zählen:

echo "${str: -1}"
65
perreal

Per @perreal ist das Zitieren von Variablen wichtig, aber da ich diesen Beitrag wie 5 Mal gelesen habe, bevor ich in den Kommentaren einen einfacheren Ansatz für die vorliegende Frage gefunden habe ...

str='abcd/'
echo "${str: -1}"

Ausgabe: /

str='abcd*'
echo "${str: -1}"

Ausgabe: *

Vielen Dank an alle, die daran teilgenommen haben. Ich habe im gesamten Thread entsprechend + 1 hinzugefügt!

175
quickshiftin

Ich weiß, dass dies ein sehr alter Thread ist, aber niemand hat erwähnt, was für mich die sauberste Antwort ist:

echo -n $str | tail -c 1

Beachten Sie das -n ist nur so, dass das Echo am Ende keine neue Zeile enthält.

26
user5394399

Versuchen:

"${str:$((${#str}-1)):1}"

Zum Beispiel:

[email protected]:~$ str="A random string*"; echo "$str"
A random string*
[email protected]:~$ echo "${str:$((${#str}-1)):1}"
*
[email protected]:~$ echo "${str:$((${#str}-2)):1}"
g
5
mark_infinite

Einzelne Zeile:

${str:${#str}-1:1}

Jetzt:

echo "${str:${#str}-1:1}"
5
Eduardo Cuomo

eine andere lösung mit awk script:

letzte 1 Zeichen:

echo $str | awk '{print substr($0,length,1)}'

letzte 5 Zeichen:

echo $str | awk '{print substr($0,length-5,5)}'
4
mr.baby123

Jede bisherige Antwort impliziert, dass das Wort "Shell" in der Frage gleichbedeutend mit Bash ist.

So könnte man das in einer Standard-Bourne-Shell machen:

printf $str | tail -c 1
4
phep