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 un glissement avant l'impression. Il est également préférable de citer le paramètre dans le script (au cas où vous auriez un nom de fichier correspondant):
sh lash_ch.sh 'abcde*'
Voir également l'ordre des extensions dans le manuel de référence bash . Les variables sont développées avant l'extension du nom de fichier.
Pour obtenir le dernier caractère, vous devez simplement l'utiliser -1
comme index car 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.
"${1: -1}"
suffit donc.echo "${str:$((${#str}-1)):1}"
. Cela vous permet également de faire varier les caractères de fin renvoyés. Ce travail pour moi dans bash v4.1.0 (1)"${1:-1}
Par @perreal, citer des variables est important, mais parce que j'ai lu ce post comme 5 fois avant de trouver une approche plus simple à la question à portée de main dans les commentaires ...
Production:
/
Production:
*
Merci à tous ceux qui ont participé à cela ci-dessus; J'ai correctement ajouté des +1 tout au long du fil!
la source
${std: -1}
, sans l'espace cela ne fonctionnera pas. Je suis tombé sur ceci et j'ai trouvé que cela${std:~0}
fonctionne également (avec ou sans espace). Je ne sais pas s'il s'agit d'un comportement documenté, je n'ai pas pris la peine de le rechercher..sh
script lorsque vous essayez d'affecter le caractère récupéré à une variable. Par exemple,declare LAST=$(echo "${str: -1}")
cela entraînera la mauvaise barre rouge montrant une erreur de syntaxe commençant à:${str:0-1}
Je sais que c'est un fil très ancien, mais personne n'a mentionné laquelle pour moi est la réponse la plus claire:
Notez que
-n
c'est juste pour que l'écho n'inclue pas de nouvelle ligne à la fin.la source
une autre solution utilisant le script awk:
1 dernier caractère:
5 derniers caractères:
la source
cat file | awk '{print substr($0,length,1)}'
Merci!Une seule ligne:
Maintenant:
la source
echo "${str: -1}"
est suffisant (attention à l'espace entre:
et-
).$((...))
.Chaque réponse jusqu'à présent implique le mot «shell» dans la question équivaut à Bash.
Voici comment on pourrait faire cela dans un shell Bourne standard:
la source
echo -n
comme proposé par user5394399 évite les problèmes lorsqu'il$str
contient des caractères de format spécial.-n
interrupteur est un bashisme. Cela ne fonctionnera pas dans le shell Bourne standard comme tiret, etc ... Ce qui était le point de ma réponse.printf "%s" "$str" | ...
:-).Essayer:
Par exemple:
la source
est une bonne approche
la source