3 votes

Le décalage de la sous-chaîne Bash peut-il être omis ?

str=abcde
echo ${str:0:2} # output: ab
echo ${str::2} # outpub: ab

Le code ci-dessus aboutit au même résultat. Comme le code la documentation décrivent :

C'est ce qu'on appelle l'expansion des chaînes de caractères. Elle étend jusqu'à la longueur des caractères de la valeur du paramètre en commençant par le caractère spécifié par le décalage. Si le paramètre est @ o * un tableau indexé dont l'indice est @ o * ou un nom de tableau associatif, les résultats diffèrent comme décrit ci-dessous. Si length est omis, il s'étend à la sous-chaîne de la valeur du paramètre en commençant par le caractère spécifié par offset et en s'étendant jusqu'à la fin de la valeur. length et offset sont des expressions arithmétiques (voir Shell Arithmetic).

Si offset évalue à un nombre inférieur à zéro, la valeur est utilisée comme un décalage en caractères à partir de la fin de la valeur du paramètre. Si la valeur length évalue un nombre inférieur à zéro, il est interprété comme un décalage en caractères à partir de la fin de la valeur du paramètre plutôt que comme un nombre de caractères, et l'expansion est constituée des caractères entre le décalage et ce résultat. Notez qu'un décalage négatif doit être séparé des deux-points par au moins un espace afin d'éviter toute confusion avec la fonction :- l'expansion.

Il n'y a pas de description de l'omission offset mais en fait il peut être omis.

Je me demande s'il existe des documents que je n'ai pas remarqués.

2voto

konsolebox Points 21338

Dans la section du manuel consacrée à l'évaluation arithmétique, il est indiqué qu'une valeur nulle est interprétée comme 0, et comme nous le savons, l'argument de que l'expansion des paramètres est soumise à une évaluation arithmétique.

Une variable shell qui est nulle ou non définie est évaluée à 0 lorsqu'elle est référencée par son nom sans utiliser la syntaxe d'expansion des paramètres.

Une valeur nulle est évaluée à 0.

Il s'agit peut-être de la référence la plus proche de la raison pour laquelle une valeur vide est évaluée à 0.

Cependant, je continue de penser que l'autorisation des arguments vides devrait être documentée.

2voto

kvantour Points 11497

Lorsque vous regardez man bash vous pouvez lire :

${parameter:offset}, ${parameter:offset:length} Expansion des chaînes de caractères. Expansion jusqu'à la longueur des caractères de la valeur du paramètre en commençant par le caractère spécifié par le décalage. Si le paramètre est @ un tableau indexé dont l'indice est @ o * ou un nom de tableau associatif, les résultats diffèrent comme décrit ci-dessous. Si length est omis, se développe jusqu'à la sous-chaîne de la valeur du paramètre commençant au caractère spécifié par offset et s'étendant jusqu'à la fin de la valeur. length y offset sont des expressions arithmétiques (voir ÉVALUATION ARITHMETIQUE ci-dessous).

Il convient de préciser qu'il n'est pas possible de omettre les offset valeur. Ici, omettre implique que le caractère <colon> est également manquant. Le tableau ci-dessous montre qu'il y a une ambiguïté dans ce cas :

offset

omis offset

length

${parameter:offset:length}

${parameter:length}

omis length

${parameter:offset}

${parameter}

D'un point de vue syntaxique, il n'est pas possible d'omettre length car il n'est pas possible de savoir si length o offset est omis.

Il est possible de le laisser empty . man bash indique clairement que les deux length y offset sont des expressions arithmétiques et dans cette section nous trouvons.

Une valeur nulle est évaluée à 0.

Cela implique à la fois des variables non paramétrées et des expressions vides :

$ unset v
$ echo $(( v )) $(( ))
0 0

En tant que offset est une expression arithmétique, une valeur vide aura la même valeur que $(( )) qui est 0 .

Les éléments suivants sont donc tous équivalents :

${parameter:0:length} == ${paramter::length}
${parameter:offset:0} == ${parameter:offset:} == ""
${parameter:0:0} == ${parameter::} == ""

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