Uso de shift $ (($ OPTIND -1))

0

Eu vi a postagem Explicação do comando de shell . Como eu sou incapaz de comentar lá, eu gostaria de saber o uso do comando Shift. Isso significa que os parâmetros passados para o script estarão vazios após o ponto em que o deslocamento é usado? qual seria a vantagem do comando

    
por xGen 14.10.2015 / 09:03

4 respostas

1

Isso pode resultar em uma lista arg vazia, ou não. Depende de quantos argumentos houve para começar e quantos argumentos relevantes getopts encontraram (e definiram em $ OPTIND). getopts ignora todos os argumentos que não começam com - e -- diz ao getopts para parar o processamento de quaisquer argumentos subsequentes como opções (por exemplo, rm -f -- -filenamebeginningwith-.txt ).

por exemplo. se você tiver 5 args -x -y -z file1 file2 , então shift 3 irá se livrar dos três primeiros argumentos, deixando apenas file1 file2 .

    
por 14.10.2015 / 09:25
1

O motivo do comando shift $((OPTIND -1)) é "pular" as opções que foram analisadas por getopts e deixar os argumentos do tipo de arquivo disponíveis para processamento posterior.

Observe que $OPTIND é uma variável de shell gerenciada pelo comando getopts builtin do shell. Quando o shell é iniciado, $OPTIND é igual a 1 e é incrementado toda vez que uma chamada getopts descobre opções ou argumentos de opção.

shift remove uma quantidade arbitrária de argumentos do início da lista atual de argumentos.

  • Chamar shift 3 removerá irrecuperavelmente os 3 primeiros argumentos da lista de argumentos do shell.
por 14.10.2015 / 11:31
1

Basicamente, o comando "shift" permite que você "passe por" os argumentos passados para um script ou uma função.

O principal uso é acessar $ 0 em um loop, enquanto "mudando" até que você não receba mais argumentos.

O uso exato do shift $ (($ OPTIND-1)) é pular as opções analisadas e padronizadas por getopts (ou seja, -uvh se tornará -u -v -h), então, ao fazer isso, você terá seu primeiro argumento "não-opção" na posição $ 0 da matriz de argumentos.

Espero que isso ajude.

    
por 14.10.2015 / 16:22
0

Uma demonstração pode iluminar:

$ set -- 1 2 3 4 5 6  # set the positional parameter $1, $2, ...
$ echo "$@"   # print the positional params
1 2 3 4 5 6
$ shift 3
$ echo "$@"
4 5 6

Agora, [$ 1-eq 4] & & [$ 2-eq 5] & & [$ 3-eq 6]

    
por 14.10.2015 / 14:02

Tags