web-dev-qa-db-fra.com

Comment obtenir le dernier caractère d'une chaîne dans un shell?

J'ai écrit les lignes suivantes pour obtenir le dernier caractère d'une chaîne:

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

Cela fonctionne pour abcd/:

$ bash last_ch.sh abcd/
/

Il ne fonctionne pas pour abcd*:

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

Il répertorie les fichiers du dossier actuel.

107
thinker3

C'est l'une des raisons pour lesquelles vous devez citer vos variables:

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

Sinon, bash développe la variable et, dans ce cas, effectue une suppression avant l'impression. Il est également préférable de citer le paramètre dans le script (si vous avez un nom de fichier correspondant):

sh lash_ch.sh 'abcde*'

Voir également l'ordre des extensions dans le manuel de référence de bash . Les variables sont développées avant l'expansion du nom de fichier.

Pour obtenir le dernier caractère, vous devez simplement utiliser -1 comme index car les index négatifs comptent à partir de la fin de la chaîne:

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

Pour @perreal, il est important de citer des variables, mais parce que j'ai lu ce billet comme 5 fois avant de trouver une approche plus simple de la question à l'examen dans les commentaires ...

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

Sortie: /

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

Sortie: *

Merci à tous ceux qui ont participé à ce qui précède; J'ai correctement ajouté +1 dans le fil de discussion!

175
quickshiftin

Je sais que c'est un très vieux fil, mais personne n'a mentionné ce qui pour moi est la réponse la plus nette:

echo -n $str | tail -c 1

Notez que le -n est juste pour que l'écho n'inclue pas de nouvelle ligne à la fin.

26
user5394399

Essayer:

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

Par exemple:

someone@mypc:~$ str="A random string*"; echo "$str"
A random string*
someone@mypc:~$ echo "${str:$((${#str}-1)):1}"
*
someone@mypc:~$ echo "${str:$((${#str}-2)):1}"
g
5
mark_infinite

Une seule ligne:

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

Maintenant:

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

une autre solution utilisant le script awk:

1 dernier caractère:

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

5 derniers caractères:

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

Jusqu'à présent, chaque réponse implique que le mot "Shell" dans la question équivaut à Bash.

Voici comment procéder dans un shell standard:

printf $str | tail -c 1
4
phep