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.
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}"
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!
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.
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
Une seule ligne:
${str:${#str}-1:1}
Maintenant:
echo "${str:${#str}-1:1}"
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)}'
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