O que significa $ {1: 0: 2} neste contexto?

18

Estou analisando o código exibido abaixo e ele verifica a entrada se os argumentos de linha / coluna começarem com -r ou -c . O que significa ${1:0:2} neste contexto?

rowArgName="-r"
colArgName="-c"
if [ "${1:0:2}" != $rowArgName ] && [ "${1:0:2}" != $colArgName ]
then
   echo $correctCmdMsg >&2
   exit 1
fi
    
por user165213 11.04.2016 / 09:11

3 respostas

30

É um padrão de Expansão de Expansão de Substring (subclasse de Expansão de Parâmetro) do shell.

O formato é:

${parameter:offset:length}

e a indexação começa em 0.

Digamos que você tenha uma variável foo e, em seguida, ${foo:0:2} produza os dois primeiros caracteres (da posição 0 para os próximos 2).

Exemplo:

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

No seu caso, o primeiro número, 1 , refere-se ao nome da variável $1 , que é o primeiro argumento passado pela linha de comando (no programa principal) ou o primeiro argumento passado à função.

Portanto, no seu caso, "${1:0:2}" será:

  • comece a extrair a substring a partir do índice 0, ou seja, primeiro caractere

  • e continuar até os próximos dois caracteres

então, após a operação, você obterá os dois primeiros caracteres (indexados em 0 e 1) da string de entrada.

Os [ "${1:0:2}" != $rowArgName ] e [ "${1:0:2}" != $colArgName ] estão verificando se a subtração de saída é igual a algumas outras strings.

    
por 11.04.2016 / 09:30
15

Um pequeno extrato de man bash :

${parameter:offset:length}

Substring Expansion. Expands to up to length characters of the value of parameter starting at the character specified by offset. If parameter is @, an indexed array subscripted by @ or *, or an associative array name, the results differ as described below. If length is omitted, expands to the substring of the value of parameter starting at the character specified by offset and extending to the end of the value. length and offset are arithmetic expressions (see ARITHMETIC EVALUATION below).

    
por 11.04.2016 / 09:32
5

Esta é uma extração de substring simples de uma variável. A variável em questão é o primeiro parâmetro para o script (que é 1 ).

Se eu tiver uma variável, FOO, posso ver os dois primeiros caracteres de seu valor com ${FOO:0:2} . A mesma coisa está sendo feita no seu exemplo com o primeiro argumento.

    
por 11.04.2016 / 09:31