Que signifie $ {1: 0: 2} dans ce contexte?

19

Je regarde le code affiché ci-dessous et il vérifie l'entrée si les arguments de ligne / colonne commencent par soit -rou -c. Que ${1:0:2}signifie dans ce contexte?

rowArgName="-r"
colArgName="-c"
if [ "${1:0:2}" != $rowArgName ] && [ "${1:0:2}" != $colArgName ]
then
   echo $correctCmdMsg >&2
   exit 1
fi
user165213
la source
7
Vous devez inclure le shell que vous utilisez dans la question. C'est probablement le cas bash.
Raphael Ahrens
2
Cela semble être fait pour analyser les arguments de la ligne de commande. Vous voudrez probablement connaître getoptou getoptsvous faciliter la vie (ou la vie de celui qui a fait cela).
Carlos Campderrós

Réponses:

31

Il s'agit d'un modèle de shell Substring Expansion (sous-classe de Parameter Expansion).

Le format est:

${parameter:offset:length}

et l'indexation commence à 0.

Disons que vous avez une variable foo, puis ${foo:0:2}donne les deux premiers caractères (de la position 0 aux 2 suivants).

Exemple:

$ foo=spamegg
$ echo "${foo:0:2}"
sp

Dans votre cas, le premier nombre, 1fait référence au nom de la variable $1, qui est le premier argument passé via la ligne de commande (dans le programme principal) ou le premier argument passé à la fonction.

Donc dans votre cas "${1:0:2}":

  • commencer à extraire la sous-chaîne à partir de l'index 0, c'est-à-dire le premier caractère

  • et continuez jusqu'aux deux personnages suivants

Ainsi, après l'opération, vous obtiendrez les deux premiers caractères (indexés à 0 et 1) de la chaîne d'entrée.

Les [ "${1:0:2}" != $rowArgName ]et [ "${1:0:2}" != $colArgName ]vérifient si la sous-chaîne de sortie est égale à certaines autres chaînes.

heemayl
la source
1
Essentiellement, il vérifie si l'utilisateur a fourni 1 $ avec -cou -r, ce qui a probablement été mieux implémenté avecgetopts
Sergiy Kolodyazhnyy
15

Un petit extrait de man bash:

$ {paramètre: offset: longueur}

Extension de sous-chaîne . Se développe jusqu'à des lengthcaractères de la valeur de parameterdépart au caractère spécifié par offset. Si le paramètre est @, un tableau indexé indexé par @ou *, ou un nom de tableau associatif, les résultats diffèrent comme décrit ci-dessous. Si lengthest omis, se développe dans la sous-chaîne de la valeur en parametercommençant au 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 ÉVALUATION ARITHMÉTIQUE ci-dessous).

Ralph Rönnquist
la source
5

Il s'agit d'une extraction de sous-chaîne simple à partir d'une variable. La variable en question est le premier paramètre du script (qui est 1).

Si j'ai une variable, FOO, je peux voir les deux premiers caractères de sa valeur avec ${FOO:0:2}. La même chose se fait dans votre exemple avec le premier argument.

DopeGhoti
la source