¿Qué significa $ {1: 0: 2} en este contexto?

19

Estoy mirando el código que se muestra a continuación y comprueba la entrada si los argumentos de fila / columna comienzan con -ro -c. ¿Qué ${1:0:2}significa en este contexto?

rowArgName="-r"
colArgName="-c"
if [ "${1:0:2}" != $rowArgName ] && [ "${1:0:2}" != $colArgName ]
then
   echo $correctCmdMsg >&2
   exit 1
fi
usuario165213
fuente
77
Debe incluir el shell que está utilizando en la pregunta. Lo cual es probable bash.
Raphael Ahrens
2
Esto parece hacerse para analizar los argumentos de la línea de comandos. Probablemente querrás saber getopto getoptshacerte la vida más fácil (o la vida de quien hizo esto).
Carlos Campderrós

Respuestas:

31

Es un patrón de shell de expansión de subcadena (subclase de expansión de parámetros).

El formato es:

${parameter:offset:length}

y la indexación comienza en 0.

Digamos que tiene una variable foo, luego ${foo:0:2}produce los dos primeros caracteres (desde la posición 0 a los siguientes 2).

Ejemplo:

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

En su caso, el primer número, se 1refiere al nombre de la variable $1, que es el primer argumento pasado a través de la línea de comando (en el programa principal) o el primer argumento pasado a la función.

Entonces, en su caso "${1:0:2}":

  • comenzar a extraer la subcadena a partir del índice 0, es decir, el primer carácter

  • y continuar hasta los próximos dos personajes

así que después de la operación obtendrá los dos primeros caracteres (indexados en 0 y 1) de la cadena de entrada.

El [ "${1:0:2}" != $rowArgName ]y [ "${1:0:2}" != $colArgName ]están comprobando si la subcadena de salida es igual a algunas otras cadenas.

heemayl
fuente
1
Esencialmente está verificando si el usuario proporcionó o no $ 1 con -co -r, lo que probablemente se haya implementado mejorgetopts
Sergiy Kolodyazhnyy
15

Un pequeño extracto de man bash:

$ {parámetro: desplazamiento: longitud}

Expansión de subcadenas . Se expande hasta en lengthcaracteres del valor de parametercomenzar en el carácter especificado por offset. Si el parámetro es @, una matriz indexada suscrita por @o *, o un nombre de matriz asociativa, los resultados difieren como se describe a continuación. Si lengthse omite, se expande a la subcadena del valor de parametercomenzar en el carácter especificado por offset y se extiende hasta el final del valor. length y offset son expresiones aritméticas (ver EVALUACIÓN ARITMÉTICA a continuación).

Ralph Rönnquist
fuente
5

Esta es una extracción de subcadena simple de una variable. La variable en cuestión es el primer parámetro del script (que es 1).

Si tengo una variable, FOO, puedo ver los dos primeros caracteres de su valor con ${FOO:0:2}. Lo mismo se está haciendo en su ejemplo con el primer argumento.

DopeGhoti
fuente