159 votes

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

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

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

Il fonctionne pour abcd/ :

$ bash last_ch.sh abcd/
/

Es *ne fonctionne pas pour `abcd`** :

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

Es liste les fichiers du dossier courant .

5voto

Eduardo Cuomo Points 1433

Ligne unique :

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

Maintenant :

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

4voto

mark_infinite Points 198

Essayez :

"${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

1voto

urcodebetterznow Points 541

Para portabilité vous pouvez dire "${s#"${s%?}"}" :

#!/bin/sh
m=bzzzM n=bzzzN
for s in \
    'vv'  'w'   ''    'uu  ' ' uu ' '  uu' / \
    'ab?' 'a?b' '?ab' 'ab??' 'a??b' '??ab' / \
    'cd#' 'c#d' '#cd' 'cd##' 'c##d' '##cd' / \
    'ef%' 'e%f' '%ef' 'ef%%' 'e%%f' '%%ef' / \
    'gh*' 'g*h' '*gh' 'gh**' 'g**h' '**gh' / \
    'ij"' 'i"j' '"ij' "ij'"  "i'j"  "'ij"  / \
    'kl{' 'k{l' '{kl' 'kl{}' 'k{}l' '{}kl' / \
    'mn$' 'm$n' '$mn' 'mn$$' 'm$$n' '$$mn' /
do  case $s in
    (/) printf '\n' ;;
    (*) printf '.%s. ' "${s#"${s%?}"}" ;;
    esac
done

Sortie :

.v. .w. .. . . . . .u. 
.?. .b. .b. .?. .b. .b. 
.#. .d. .d. .#. .d. .d. 
.%. .f. .f. .%. .f. .f. 
.*. .h. .h. .*. .h. .h. 
.". .j. .j. .'. .j. .j. 
.{. .l. .l. .}. .l. .l. 
.$. .n. .n. .$. .n. .n.

0voto

expr $str : '.*\(.\)'

Ou

echo ${str: -1}

0voto

spiralofhope Points 132

Pour toute personne intéressée par une méthode POSIX pure :

https://github.com/spiralofhope/shell-random/blob/master/live/sh/scripts/string-fetch-last-character.sh

#!/usr/bin/env  sh

string_fetch_last_character() {
  length_of_string=${#string}
  last_character="$string"
  i=1
  until [ $i -eq "$length_of_string" ]; do
    last_character="${last_character#?}"
    i=$(( i + 1 ))
  done

  printf  '%s'  "$last_character"
}

string_fetch_last_character  "$string"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X