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 .

219voto

quickshiftin Points 6379

Par @perreal, citer les variables est important, mais parce que j'ai lu ce post au moins 5 fois avant de trouver une approche plus simple à la question posée dans les commentaires...

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

Vous pouvez également utiliser ${str:0-1} comme indiqué dans les commentaires.

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

Note : L'espace supplémentaire dans ${str: -1} es nécessaire sinon ${str:-1} aurait pour conséquence 1 étant pris comme valeur par défaut si str est nulle ou vide.

${parameter:-word}
       Use Default Values.  If parameter is unset or null, the
       expansion of word is substituted.  Otherwise, the value of
       parameter is substituted.

Merci à tous ceux qui ont participé à la discussion ci-dessus ; j'ai ajouté des +1 comme il se doit dans le fil de discussion !

135voto

perreal Points 47912

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 fait du globbing avant de l'imprimer. Il est également préférable de citer le paramètre au script (au cas où vous auriez un nom de fichier correspondant) :

sh lash_ch.sh 'abcde*'

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

Pour obtenir le dernier caractère, il suffit d'utiliser -1 comme indice puisque les indices négatifs comptent à partir de la fin de la chaîne :

echo "${str: -1}"

L'espace après les deux points ( : ) est OBLIGATOIRE.

Cette approche ne fonctionnera pas sans l'espace.

48voto

user5394399 Points 481

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 propre :

echo -n $str | tail -c 1

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

16voto

phep Points 58

Jusqu'à présent, toutes les réponses impliquent que le mot "coquille" dans la question équivaut à Bash.

Voici comment on pourrait faire cela dans un shell Bourne standard :

printf "%s" "$str" | tail -c 1

6voto

mr.baby123 Points 376

Une autre solution utilisant awk script :

1 dernier caractère :

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

les 5 derniers caractères :

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

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