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

19

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

rowArgName="-r"
colArgName="-c"
if [ "${1:0:2}" != $rowArgName ] && [ "${1:0:2}" != $colArgName ]
then
   echo $correctCmdMsg >&2
   exit 1
fi
user165213
fonte
7
Você deve incluir o shell que está usando na pergunta. O que é provavelmente bash.
Raphael Ahrens #
2
Isso parece ser feito para analisar argumentos de linha de comando. Provavelmente você vai querer conhecer getoptou getoptsfacilitar sua vida (ou a vida de quem fez isso).
Carlos Campderrós

Respostas:

31

É um padrão de shell de Substring Expansion (subclasse de Parameter Expansion).

O formato é:

${parameter:offset:length}

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

Digamos que você tenha uma variável e foo, em seguida, ${foo:0:2}produz os dois primeiros caracteres (da posição 0 aos 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 transmitido via linha de comando (no programa principal) ou o primeiro argumento transmitido para a função.

Então, no seu caso, "${1:0:2}"irá:

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

  • e continue até os próximos dois caracteres

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

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

heemail
fonte
1
Essencialmente, está verificando se ou não usuário forneceu US $ 1, com -cou -r, o que provavelmente melhor têm sido implementadas comgetopts
Sergiy Kolodyazhnyy
15

Um pequeno extrato de man bash:

$ {parâmetro: deslocamento: comprimento}

Expansão de Substring . Expande para até lengthcaracteres com o valor de parameteriniciar no caractere especificado por offset. Se o parâmetro for @uma matriz indexada inscrita por @ou *ou um nome associativo da matriz, os resultados diferem conforme descrito abaixo. Se lengthfor omitido, expande para a substring do valor parameteriniciando no caractere especificado por offset e estendendo até o final do valor. length e offset são expressões aritméticas (consulte AVALIAÇÃO ARITMÉTICA abaixo).

Ralph Rönnquist
fonte
5

Essa é uma extração simples de substring 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 do seu valor com ${FOO:0:2}. O mesmo está sendo feito no seu exemplo com o primeiro argumento.

DopeGhoti
fonte